0

我正试图围绕 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

谁能向我解释这里发生了什么?显然,最后两个查询字符串在逻辑上是相同的,但它们仍然返回不同的结果。

4

0 回答 0