0

请帮助我理解为什么“不等于”条件不能正常工作。

>>>d = {'a' : [1, 2, 3, 3, 1, 4],
>>>     'b' : [4, 3, 2, 1, 2, 2]}
>>>df = pd.DataFrame(d)
    a   b
0   1   4
1   2   3
2   3   2
3   3   1
4   1   2
5   4   2

如果我使用相等条件,我们会得到正确的结果logical_and

>>>df[np.logical_and(df['a']==3, df['b']==2)]
    a   b
2   3   2

但是,如果我们将条件更改为不等于,它将停止正常工作:

>>>df[np.logical_and(df['a']!=3, df['b']!=2)]
    a   b
0   1   4
1   2   3

这类似于条件 OR 而不是 AND。

~但是如果我们以前使用它,它又可以正常工作了np.logical_and

>>>df[~np.logical_and(df['a']==3, df['b']==2)]
    a   b
0   1   4
1   2   3
3   3   1
4   1   2
5   4   2

我应该了解哪些逻辑条件以避免失败?

4

3 回答 3

9

我认为您应该了解德摩根定律

not (A or B) == (not A) and (not B)
not (A and B) == (not A) or (not B)

这只是命题逻辑,与 Python 本身无关。

我们可以用真值表自己验证。如果我们为 制作一个真值表A and B,我们会看到:

 |A|a|
-+-+-+
B|T|F|
-+-+-+
b|F|F|
-+-+-+

这里A表示A为真,a表示A为假(与 相同B)。我们分别表示T真和F假。现在对面的表格是这样的:

 |A|a|
-+-+-+
B|F|T|
-+-+-+
b|T|T|
-+-+-+

但是,如果我们构造一个真值表,(not A) and (not B)我们会得到:

 |A|a|
-+-+-+
B|F|F|
-+-+-+
b|F|T|
-+-+-+

所以两者不是等价的。

像这样看:如果条件是:

A 必须是 5 并且 B 必须是 3

那么相反的不是 A must not be 5 and B must not be 3。因为现在 A 为 5 而 B 为 2 的情况不满足我们的第一个条件,但也不满足我们的(错误的)第二个要求。相反的是:

A 不能是 5 或 B 不能是 3(相反)

因为从那一刻起两者之一不是 5 或 3 就足够了。

于 2017-07-19T19:56:00.143 回答
3

如果您尝试过滤数据框,您可能想尝试不同的方法。看一下dataframe.loc

所以在你的例子中尝试:

df.loc[(df['a'] != 3) & (df['b'] != 2)]

它使事情更具可读性,imo

于 2017-07-19T19:57:12.280 回答
3

还有另一种 Pandas 方法来做到这一点:

df.query("a != 3 or b != 4")
于 2017-07-19T20:00:39.443 回答