在具有lambda函数的数据帧中使用if语句

时间:2015-01-08 16:39:24

标签: python pandas lambda conditional-statements

我正在尝试根据if语句向数据框添加新列,具体取决于两列的值。即,如果列x ==无,则列y,否则列x

下面是我写的脚本但不起作用。任何想法?

dfCurrentReportResults['Retention'] =  dfCurrentReportResults.apply(lambda x : x.Retention_y if x.Retention_x == None else x.Retention_x)

此外,我收到此错误消息:     AttributeError :(“'系列'对象没有属性'Retention_x'”,未在索引BUSINESSUNIT_NAME发生')

fyi:BUSINESSUNIT_NAME是第一个列名

其他信息:

我打印出来的数据看起来像这样,如果有其他人保留NaN,我想添加第3列来取值。

   Retention_x  Retention_y
0            1          NaN
1          NaN     0.672183
2          NaN     1.035613
3          NaN     0.771469
4          NaN     0.916667
5          NaN          NaN
6          NaN          NaN
7          NaN          NaN
8          NaN          NaN
9          NaN          NaN

更新 最后我遇到了引用Null的问题或者在我的数据框中是空的,我使用的最后一行代码也包括轴= 1回答了我的问题。

 dfCurrentReportResults['RetentionLambda'] = dfCurrentReportResults.apply(lambda x : x['Retention_y'] if pd.isnull(x['Retention_x']) else x['Retention_x'], axis = 1)

感谢@EdChum,@ strim099和@aus_lacy所有的输入。随着我的数据集变大,如果我注意到性能问题,我可能会切换到np.where选项。

2 个答案:

答案 0 :(得分:2)

只需使用np.where

dfCurrentReportResults['Retention'] =  np.where(df.Retention_x == None, df.Retention_y, else df.Retention_x)

这使用测试条件,第一个参数并将值设置为df.Retention_y其他df.Retention_x

也避免在可能的情况下使用apply,因为这只是循环遍历值,np.where是一个矢量化方法,并且可以更好地扩展。

<强>更新

确定无需使用np.where只需使用以下更简单的语法:

dfCurrentReportResults['Retention'] =  df.Retention_y.where(df.Retention_x == None, df.Retention_x)

进一步更新

dfCurrentReportResults['Retention'] =  df.Retention_y.where(df.Retention_x.isnull(), df.Retention_x)

答案 1 :(得分:2)

你的lambda是在0轴上运行的,它是列式的。只需将axis=1添加到apply arg列表即可。这清楚地记录在案。

In [1]: import pandas

In [2]: dfCurrentReportResults = pandas.DataFrame([['a','b'],['c','d'],['e','f'],['g','h'],['i','j']], columns=['Retention_y', 'Retention_x'])

In [3]: dfCurrentReportResults['Retention_x'][1] = None

In [4]: dfCurrentReportResults['Retention_x'][3] = None

In [5]: dfCurrentReportResults
Out[5]:
  Retention_y Retention_x
0           a           b
1           c        None
2           e           f
3           g        None
4           i           j

In [6]: dfCurrentReportResults['Retention'] =  dfCurrentReportResults.apply(lambda x : x.Retention_y if x.Retention_x == None else x.Retention_x, axis=1)

In [7]: dfCurrentReportResults
Out[7]:
  Retention_y Retention_x Retention
0           a           b         b
1           c        None         c
2           e           f         f
3           g        None         g
4           i           j         j