首页  >  文章  >  后端开发  >  为什么在 Pandas 过滤操作中使用 AND (`&`) 和 OR (`|`) 运算符会产生意外的结果?

为什么在 Pandas 过滤操作中使用 AND (`&`) 和 OR (`|`) 运算符会产生意外的结果?

Susan Sarandon
Susan Sarandon原创
2024-10-25 06:55:28629浏览

Why Does Using AND (`&`) and OR (`|`) Operators in Pandas Filtering Operations Produce Unexpected Results?

pandas:索引数据帧时的多个条件 - 意外行为

在数据分析中,pandas 是操作和处理数据帧的重要库。在执行过滤操作时,了解使用多个条件时运算符的行为至关重要。

让我们考虑一个场景,我们想要根据两列“a”和“a”中的值过滤数据框中的行。 b'。使用 AND '&' 运算符和 OR '|'运算符,我们期望 AND 删除至少一个值等于 -1 的行,而 OR 应保留两个值均为 -1 的行。

<code class="python">df = pd.DataFrame({'a': range(5), 'b': range(5)})
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 (|)',]))</code>

意外的是,AND 运算符删除至少有一个值的每一行是 -1,而 OR 运算符要求两个值都为 -1 才能删除它们。

理解这种行为的关键在于记住我们正在根据我们想要保留的内容编写条件,不是我们想要删除的。

  • 对于 df1: (df.a != -1) & (df.b != -1) 表示“保留 df.a 不存在的行 - 1 且 df.b 不是 -1”,这相当于删除至少一个值为 -1 的行。
  • 对于 df2: (df.a != -1) | (df.b != -1) 表示“保留 df.a 或 df.b 不为 -1 的行”,相当于删除两个值为 -1 的行。

使用 df.loc 和 df.iloc 等链式访问而不是 df['a'][1] = -1 来避免潜在问题至关重要。

以上是为什么在 Pandas 过滤操作中使用 AND (`&`) 和 OR (`|`) 运算符会产生意外的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn