熊猫:索引数据框时的多个条件 \- 意外行为

新手上路,请多包涵

我正在按两列中的值过滤数据框中的行。

出于某种原因,OR 运算符的行为就像我期望 AND 运算符的行为一样,反之亦然。

我的测试代码:

 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 的每一行。另一方面, OR 运算符要求两个值都等于 -1 才能删除它们。我会期待完全相反的结果。谁能解释这种行为?

我正在使用熊猫 0.13.1。

原文由 Wojciech Walczak 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 384
2 个回答

如您所见,AND 运算符删除至少一个值等于 -1 的每一行。另一方面,OR 运算符要求两个值都等于 -1 才能删除它们。

这是正确的。请记住,您是根据要 保留 的内容而不是要删除的内容来编写条件。对于 df1

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

您是说“保留 df.a 不是 -1 且 df.b 不是 -1 的行”,这与删除至少一个值为-1。

对于 df2

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

您说的是“保留 df.adf.b 不是 -1 的行”,这与删除两个值为 -1 的行相同。

PS:像 df['a'][1] = -1 这样的链式访问会给你带来麻烦。最好养成使用 .loc.iloc 的习惯。

原文由 DSM 发布,翻译遵循 CC BY-SA 3.0 许可协议

您还可以使用 query() ,即:

 df_filtered = df.query('a == 4 & b != 2')

原文由 Pedro Lobito 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题