1. ホーム
  2. python

[解決済み] pandas: データフレームのインデックス作成時の複数条件 - 予期せぬ動作

2022-03-04 20:41:37

質問

データフレーム内の行を2つの列の値でフィルタリングしています。

なぜか OR 演算子が AND 演算子と同じような動作をし、その逆もまた然りです。

私のテストコードです。

import pandas as pd

df = pd.DataFrame({'a': range(5), 'b': range(5) })

# let's insert some -1 values
df['a'][1] = -1
df['b'][1] = -1
df['a'][3] = -1
df['b'][4] = -1

df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a != -1) | (df.b != -1)]

print pd.concat([df, df1, df2], axis=1,
                keys = [ 'original df', 'using AND (&)', 'using OR (|)',])

そして、その結果。

      original df      using AND (&)      using OR (|)    
             a  b              a   b             a   b
0            0  0              0   0             0   0
1           -1 -1            NaN NaN           NaN NaN
2            2  2              2   2             2   2
3           -1  3            NaN NaN            -1   3
4            4 -1            NaN NaN             4  -1

[5 rows x 6 columns]

ご覧の通り AND 演算子は、少なくとも1つの値が -1 . 一方 OR 演算子は、両方の値が等しいことを要求します。 -1 を削除します。私は全く逆の結果を期待します。どなたかこの挙動を説明していただけませんか?

pandas 0.13.1を使っています。

どのように解決するのですか?

<ブロッククオート

ご覧の通り、AND演算子は、少なくとも1つの行を削除します。 の値は-1です。一方、OR演算子では両方の値が の値が-1でないと落とせません。

そうなんだ。 をどうしたいかという観点で条件を書いていることを忘れないでください。 保つ 何を捨てるかではなく、何を捨てたいかという観点で。 例えば df1 :

df1 = df[(df.a != -1) & (df.b != -1)]

あなたが言っているのは、"keep the rows in which df.a が-1でなく、かつ df.b isn't -1"、これは少なくとも1つの値が-1であるすべての行を削除するのと同じです。

について df2 :

df2 = df[(df.a != -1) | (df.b != -1)]

あなたが言っているのは、以下のどちらかの行を保持するということです。 df.a または df.b が-1でない場合、両方の値が-1である行を削除するのと同じです。

追記:以下のような連鎖したアクセス df['a'][1] = -1 はトラブルに巻き込まれる可能性があります。 を使う習慣をつけるとよいでしょう。 .loc.iloc .