支持 Nan 的 Pandas Lambda 函数

新手上路,请多包涵

我正在尝试在 Pandas 中编写一个 lambda 函数来检查 Col1 是否为 Nan,如果是,则使用另一列的数据。我在获取代码(下方)以正确编译/执行时遇到问题。

 import pandas as pd
import numpy as np
df=pd.DataFrame({ 'Col1' : [1,2,3,np.NaN], 'Col2': [7, 8, 9, 10]})
df2=df.apply(lambda x: x['Col2'] if x['Col1'].isnull() else x['Col1'], axis=1)

有没有人知道如何使用 lambda 函数编写这样的解决方案,或者我是否超出了 lambda 的能力?如果没有,您还有其他解决方案吗?谢谢。

原文由 Tyler Russell 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 880
2 个回答

您需要 pandas.isnull 检查标量是否为 NaN

 df = pd.DataFrame({ 'Col1' : [1,2,3,np.NaN],
                 'Col2' : [8,9,7,10]})

df2 = df.apply(lambda x: x['Col2'] if pd.isnull(x['Col1']) else x['Col1'], axis=1)

print (df)
   Col1  Col2
0   1.0     8
1   2.0     9
2   3.0     7
3   NaN    10

print (df2)
0     1.0
1     2.0
2     3.0
3    10.0
dtype: float64

但更好的是使用 Series.combine_first

 df['Col1'] = df['Col1'].combine_first(df['Col2'])

print (df)
   Col1  Col2
0   1.0     8
1   2.0     9
2   3.0     7
3  10.0    10

另一个解决方案 Series.update

 df['Col1'].update(df['Col2'])
print (df)
   Col1  Col2
0   8.0     8
1   9.0     9
2   7.0     7
3  10.0    10

原文由 jezrael 发布,翻译遵循 CC BY-SA 3.0 许可协议

假设您确实有第二列,即:

df = pd.DataFrame({ 'Col1' : [1,2,3,np.NaN], 'Col2': [1,2,3,4]})

这个问题的正确解决方案是:

 df['Col1'].fillna(df['Col2'], inplace=True)

原文由 Gerges 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题