pandas データフレームquery
メソッドの予期しない動作に頭を悩ませようとしています。
テストデータフレームを想定:
>>> df = pd.DataFrame([[1,1,1,2,2,2],[1,2,3,4,5,6]], columns=['a', 'b', 'c', 'd', 'e', 'f'])
>>> df
a b c d e f
0 1 1 1 2 2 2
1 1 2 3 4 5 6
次のクエリ式で最初の行を選択できます。
>>> df.query('a == b == c == 1 & d == e == f == 2')
a b c d e f
0 1 1 1 2 2 2
ただし、私の目的は、上記の式を満たす行を除くすべての行を選択することです。直感的には、式全体を括弧で囲み、前に論理式を追加するだけで機能するはずnot
です。- 右?
>> df.query('~(a == b == c == 1 & d == e == f == 2)')
a b c d e f
0 1 1 1 2 2 2
1 1 2 3 4 5 6
期待した結果ではないことは明らかです。しかしnot
、少し代数を使って を式に書き込めば、すべてうまくいきます。
>>> df.query('~(a == b == c == 1) | ~(d == e == f == 2)')
a b c d e f
1 1 2 3 4 5 6
ここで何が起こっているのか、誰か説明してもらえますか? 明らかに、最後の 2 つのクエリ文字列は論理的に同一ですが、それでも異なる結果を返します。