1. ホーム
  2. python

[解決済み] np.whereのpandas版

2022-03-03 19:25:14

質問

np.where はベクトル化されたif/elseのセマンティクスを持っています(Apache Sparkの when / otherwise DataFrame メソッド)。を使うことができるのは知っています。 np.wherepandas.Series しかし pandas の代わりに使用する独自の API を定義していることがよくあります。 numpy 関数を使用した方が便利です。 pd.Series / pd.DataFrame .

確かに、私は pandas.DataFrame.where . しかし、一見したところ、全く異なるセマンティクスを持っています。の最も基本的な例を書き換える方法は見つかりませんでした。 np.where パンダを使った where :

# df is pd.DataFrame
# how to write this using df.where?
df['C'] = np.where((df['A']<0) | (df['B']>0), df['A']+df['B'], df['A']/df['B'])

私は何か明らかなことを見逃しているのでしょうか?それともパンダの where と同じ名前でありながら、全く別の用途を想定しています。 np.where ?

解決方法は?

試してみてください。

(df['A'] + df['B']).where((df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])

との違いは numpy whereDataFrame where がデフォルト値を提供することです。 DataFrame は、その where メソッドが呼び出されている ( ドキュメント ).

すなわち

np.where(m, A, B)

は、おおよそ

A.where(m, B)

もし、pandasを使用して同様の呼出シグネチャが必要な場合は Pythonのメソッド呼び出しの仕組み :

pd.DataFrame.where(cond=(df['A'] < 0) | (df['B'] > 0), self=df['A'] + df['B'], other=df['A'] / df['B'])

またはkwargsなし(注意:引数の位置順序が numpy where 引数順 ):

pd.DataFrame.where(df['A'] + df['B'], (df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])