我有简单的数据框:
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')
我试图谷歌如何解决这个问题,但没有成功。请问任何提示?
答案 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)