私は単純なデータフレームを持っています:
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が正の場合、「c」の値を含む列「d」を作成します。それ以外の場合は「b」からの値。
やっています:
frame['d']=frame.apply(lambda x: frame['c'] if frame['c']>0 else frame['b'],axis=0)
しかし、「ValueError:( 'Seriesの真の値があいまいです。a.empty、a.bool()、a.item()、a.any()またはa.all()を使用してください。インデックスa ')
私はこれを解決する方法をグーグルしようとしましたが、成功しませんでした。ヒントはありますか?
それがあなたが欲しいものですか?
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
ベクトル化されたアプローチを使用する
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)