使用.apply将nan行重新编码为其他值

时间:2018-08-06 05:06:16

标签: python pandas lambda apply

我试图基于值为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)

有人可以解释为什么会这样吗?谢谢

1 个答案:

答案 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)