在今天的年份中,如果对应列的年份差为5或更大,则设计为输出1,但NaN值会出来。
import pandas as pd
from datetime import datetime
today = datetime.today()
def time(x):
if today.year - x.year > 5:
x = 1
return x
else:
x = 0
return x
df['VIP'] = df[condition]['DaysSinceJoined'].apply(time)
df['VIP']
获取错误:
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
..
2235 NaN
2236 NaN
2237 NaN
2238 NaN
2239 NaN
Name: VIP, Length: 2240, dtype: float64
该函数运行良好。问题可能在于您的初始条件:
Fist让我们生成一个比特样本数据:
foo = pd.DataFrame({'time':['1979-11-10','1962-07-22','1987-09-16','2020-09-16']})
from datetime import datetime
today = datetime.today()
def time(x):
if today.year - x.year > 5:
return 1
else:
return 0
首先,我们要确保这不是我上面建议的数据格式问题:
foo['VIP'] =foo['time'].apply(time)
"r"对象没有属性"year">
我们通过将日期转换为日期时间来解决此问题:
foo['time'] = pd.to_datetime(foo['time'])
让我们测试功能:
foo['VIP'] =foo['time'].apply(time)
时间VIP
0 1979-11-10 1
1 1962-07-22 1
2 1987-09-16 1
3 2020-09-16 0
一切都很好。
现在让我们应用一些随机条件:
foo['VIP'] =foo[foo['time'].dt.year >1980]['time'].apply(time)
时间VIP
0 1979-11-10 NaN
1 1962-07-22 NaN
2 1987-09-16 1.0
3 2020-09-16 0.0
原因是您首先将数据帧筛选为较小的位,然后将这些行馈送到函数。因为它们从未被处理过,所以它们不会得到返回值。
我建议您使用.loc函数:
foo.loc[(( today.year - foo['time'].dt.year > 5 ) & (Other_condition_here), 'vip'] = 1
foo.loc[(( today.year - foo['time'].dt.year <= 5 ) & (Other_condition_here), 'vip'] = 0
有关.loc的更多信息,请参阅文档
我想当你使用.apply时,它需要几个参数。使用地图:
df['VIP'] = df[condition]['DaysSinceJoined'].map(time)
或:
df['VIP'] = df[condition].apply(lambda x: time(x['DaysSinceJoined']))
如果不起作用,请给我们看一些样本数据。