熊猫:当'apply'函数应用于列时,输出'NaN'值



在今天的年份中,如果对应列的年份差为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']))

如果不起作用,请给我们看一些样本数据。

相关内容

  • 没有找到相关文章

最新更新