web-dev-qa-db-ja.com

Pandas dataframeの異なる列でのif条件のラムダ使用

私は単純なデータフレームを持っています:

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 ')

私はこれを解決する方法をグーグルしようとしましたが、成功しませんでした。ヒントはありますか?

10
PeterL

それがあなたが欲しいものですか?

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
18
MaxU

解決

ベクトル化されたアプローチを使用する

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)
4
piRSquared