pandas:使用多个条件过滤数据框
在 pandas 中,按多列中的值过滤数据框可能很棘手。使用 AND 运算符 (&) 时,您可能期望它的行为类似于 OR 运算符 (|),反之亦然。
考虑以下测试代码:
<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>
意外的情况结果中出现以下行为:
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 的行。此行为与预期相反。
此行为的原因在于这些运算符的使用方式。在 AND 条件中,您指定保留两个条件都为 true 的行,这相当于删除至少一个条件为 false 的行。相反,OR 条件指定保留任一条件为 true 的行,这相当于删除两个条件都为 false 的行。
为了确保清晰并避免混淆,建议对条件使用显式表示法涉及多个列。不要使用运算符链接多个条件,而是使用括号对条件进行分组并明确它们的逻辑关系。
例如,以下代码显式指定 AND 条件:
<code class="python">df1 = df[(df.a != -1) & (df.b != -1)]</code>
而以下代码代码显式指定 OR 条件:
<code class="python">df2 = df[(df.a != -1) | (df.b != -1)]</code>
通过使用显式表示法,您可以确保您的条件按预期解释并防止意外行为。
以上是为什么 pandas 中的 AND 运算符(&)在按多个条件过滤数据帧时表现得像 OR 运算符(|)?的详细内容。更多信息请关注PHP中文网其他相关文章!