我试图基于值为0、1的原始groupid创建一个新的groupid。我使用了以下代码,但未能将nan行编码为2。
final['groupid2'] = final['groupid'].apply(lambda x: 2 if x == np.nan else x)
我也尝试了以下代码,但是它给出了属性错误
final['groupid2'] = final['groupid'].apply(lambda x: 2 if x.isnull() else x)
有人可以解释为什么会这样吗?谢谢
答案 0 :(得分:2)
如果需要使用pd.isnull
,请使用apply
来检查标量:
final = pd.DataFrame({'groupid': [1, 0, np.nan],\
'B': [400, 500, 600]})
final['groupid2'] = final['groupid'].apply(lambda x: 2 if pd.isnull(x) else x)
print (final)
groupid B groupid2
0 1.0 400 1.0
1 0.0 500 0.0
2 NaN 600 2.0
Details
:
lambda函数中的值x
是标量,因为Series.apply
循环了列的每个值。因此功能pd.Series.isnull()
失败。
为了更好的测试,可以将lambda函数重写为:
def f(x):
print (x)
print (pd.isnull(x))
return 2 if pd.isnull(x) else x
1.0
False
0.0
False
nan
True
final['groupid2'] = final['groupid'].apply(f)
但Series.fillna
更好:
final['groupid2'] = final['groupid'].fillna(2)