我正在尝试根据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选项。
答案 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