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中文网其他相关文章!