我正试图围绕 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
谁能向我解释这里发生了什么?显然,最后两个查询字符串在逻辑上是相同的,但它们仍然返回不同的结果。