我正在按两列中的值筛选数据框中的行。
出于某种原因,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。
您可以使用query(),即:
没错。记住,你写的条件是你想保持的,而不是你想放弃的。对于
df1
:您的意思是“保留
df.a
不是-1且df.b
不是-1的行”,这与删除至少一个值是-1的每一行相同。对于
df2
:您的意思是“保留
df.a
或df.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应该如下所示:
相关问题 更多 >
编程相关推荐