dataframe logical_和equals工作正常,不适用于不等于

Dmi*_* K. 0 python numpy pandas logical-and

请帮助我理解为什么" 不平等 "的情况不能正常工作.

>>>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
Run Code Online (Sandbox Code Playgroud)

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

>>>df[np.logical_and(df['a']==3, df['b']==2)]
    a   b
2   3   2
Run Code Online (Sandbox Code Playgroud)

但是如果我们将条件改为不相等则它会停止正常工作:

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

这类似条件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
Run Code Online (Sandbox Code Playgroud)

关于避免失败的逻辑条件我应该知道些什么?

Wil*_*sem 9

我想你应该了解德摩根的法律:

not (A or B) == (not A) and (not B)
Run Code Online (Sandbox Code Playgroud)
not (A and B) == (not A) or (not B)
Run Code Online (Sandbox Code Playgroud)

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

我们可以用真值表来验证它.如果我们制作一个真值表A and B,我们会看到:

 |A|a|
-+-+-+
B|T|F|
-+-+-+
b|F|F|
-+-+-+
Run Code Online (Sandbox Code Playgroud)

这里A表示这A是真的,并a表示它A是假的(相同B).我们表示T真实和F虚假.现在,相反的表是:

 |A|a|
-+-+-+
B|F|T|
-+-+-+
b|T|T|
-+-+-+
Run Code Online (Sandbox Code Playgroud)

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

 |A|a|
-+-+-+
B|F|F|
-+-+-+
b|F|T|
-+-+-+
Run Code Online (Sandbox Code Playgroud)

所以这两者并不等同.

看起来像这样:如果条件是:

A必须为5,B必须为3.

然后相反的不是 A不能是5而B不能是3.从现在开始A为5且B为2的情况不满足我们的第一个条件,但它也不满足我们的(假)第二个要求.相反的是:

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

从两个中的一个不是5或3的那一刻起就足够了.