Pandas:索引数据帧时出现多个条件-意外行为

2024-04-26 20:19:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在按两列中的值筛选数据框中的行。

出于某种原因,OR运算符的行为与我预期的一样,AND运算符的行为与我预期的相反。

我的测试代码:

import pandas as pd

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。


Tags: orand数据importpandasdfrange运算符
3条回答

您可以使用query(),即:

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

As you can see, the AND operator drops every row in which at least one value equals -1. On the other hand, the OR operator requires both values to be equal to -1 to drop them.

没错。记住,你写的条件是你想保持的,而不是你想放弃的。对于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的习惯。

这里有一点数学逻辑理论:

“NOT a AND NOT b”“NOT(a OR b)”相同,因此:

“a NOT-1和b NOT-1”相当于“NOT(a is-1或b is-1)”,它与“(a is-1或b is-1)”相反(互补)。

因此,如果您想要完全相反的结果,df1和df2应该如下所示:

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

相关问题 更多 >