在Pandas数据帧中的不同列上使用lambda if条件

时间:2016-05-25 16:38:01

标签: python pandas numpy dataframe lambda

我有简单的数据框:

import pandas as pd
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('abc'))

例如:

a   b   c
0   -0.813530   -1.291862   1.330320
1   -1.066475   0.624504    1.690770
2   1.330330    -0.675750   -1.123389
3   0.400109    -1.224936   -1.704173

然后我想创建包含“c”值的列“d”,如果c为正数。其他值来自“b”。

我在尝试:

frame['d']=frame.apply(lambda x: frame['c'] if frame['c']>0 else frame['b'],axis=0)

但是得到“ValueError :('系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all() 。','发生在索引a')

我试图谷歌如何解决这个问题,但没有成功。请问任何提示?

2 个答案:

答案 0 :(得分:11)

是你想要的吗?

In [300]: frame[['b','c']].apply(lambda x: x['c'] if x['c']>0 else x['b'], axis=1)
Out[300]:
0   -1.099891
1    0.582815
2    0.901591
3    0.900856
dtype: float64

答案 1 :(得分:3)

解决方案

使用矢量化方法

frame['d'] = frame.b + (frame.c > 0) * (frame.c - frame.b)

解释

这是从

的总和得出的
(frame.c > 0) * frame.c  # frame.c if positive

(frame.c <= 0) * frame.b  # frame.b if c is not positive

然而

(frame.c <=0 )

相当于

(1 - frame.c > 0)

当合并时,你得到了

frame['d'] = frame.b + (frame.c > 0) * (frame.c - frame.b)