首页  >  文章  >  后端开发  >  为什么在 pandas 索引中使用 OR 运算符会保留值为 -1 的行,而 AND 运算符会丢弃它们,这与直观的预期相矛盾?

为什么在 pandas 索引中使用 OR 运算符会保留值为 -1 的行,而 AND 运算符会丢弃它们,这与直观的预期相矛盾?

Susan Sarandon
Susan Sarandon原创
2024-10-26 05:47:31892浏览

Why does using the OR operator in pandas indexing retain rows with -1 values, while the AND operator discards them, contradicting intuitive expectations?

pandas:索引数据框时的多个条件 - 非直观行为

根据涉及多个的条件从数据框中选择行时列中,用户可能会遇到意外行为。特别是,OR 和 AND 运算符的行为似乎与其预期角色相反。

考虑以下代码:

<code class="python">import pandas as pd

df = pd.DataFrame({'a': range(5), 'b': range(5) })

# Insert -1 values
df.loc[1, 'a'] = -1
df.loc[1, 'b'] = -1
df.loc[3, 'a'] = -1
df.loc[4, 'b'] = -1

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

df_combined = pd.concat([df, df1, df2], axis=1, keys=['Original', 'AND', 'OR'])

print(df_combined)</code>

结果:

<code class="python">   Original  AND  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</code>

如观察到的,当使用 OR 运算符 (df2) 时,其中一个或两个值为 -1 的行将被保留,而当使用 AND 运算符 (df1) 时,任何值为 -1 的行将被丢弃。这种行为与直觉预期相矛盾。

解释

看似相反的行为源于每个操作员的情况所采取的视角。对于 AND 运算符:

<code class="python">(df.a != -1) & (df.b != -1)</code>

条件读取为“保留 df.a 和 df.b 均不同于 -1 的行”,有效地排除具有至少一个 -1 值的行。

相反,OR 运算符:

<code class="python">(df.a != -1) | (df.b != -1)</code>

读作“保留 df.a 或 df.b 不同于 -1 的行”,有效地排除两个值为 -1 的行。

因此,该行为符合选择要保留的行而不是要排除的行的意图。

链式访问注意事项

代码片段 df不建议使用 ['a'][1] = -1 来修改单元格值。为了清晰和一致性,建议使用 df.loc[1, 'a'] = -1 或 df.iloc[1, 0] = -1。

以上是为什么在 pandas 索引中使用 OR 运算符会保留值为 -1 的行,而 AND 运算符会丢弃它们,这与直观的预期相矛盾?的详细内容。更多信息请关注PHP中文网其他相关文章!

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