我正在按两列中的值过滤数据框中的行。
由于某种原因,OR 运算符的行为就像我期望的 AND 运算符的行为一样,反之亦然。
我的测试代码:
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
放下它们。我期望得到完全相反的结果。有人能解释这种行为吗?
我正在使用 pandas 0.13.1。
正如您所看到的,AND 运算符会删除其中至少有一个的每一行
值等于-1。另一方面,OR 运算符需要
值等于-1以删除它们。
这是正确的。请记住,您正在根据您想要的内容编写条件keep,而不是你想要放弃的东西。为了df1
:
df1 = df[(df.a != -1) & (df.b != -1)]
你是说“保留其中的行df.a
不是 -1 且df.b
不是 -1”,这与删除至少有一个值为 -1 的每一行相同。
For df2
:
df2 = df[(df.a != -1) | (df.b != -1)]
你是说“保留其中任一行df.a
or df.b
不是 -1”,这与删除两个值为 -1 的行相同。
PS:链式访问就像df['a'][1] = -1
会给你带来麻烦。最好养成使用习惯.loc
and .iloc
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)