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

时间:2017-07-19 19:53:32

标签: python pandas numpy 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

如果我使用与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

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

3 个答案:

答案 0 :(得分:9)

我认为你应该理解De Morgan's Laws

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

这只是propositional logic,与Python本身无关。

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

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

此处A表示A为真,a表示A为假(B相同)。我们将T表示为true,将F表示为false。现在,相反的表是:

 |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不能是5而B不能是3 。从现在开始A为5且B为2的情况不满足我们的第一个条件,但它也不满足我们的(假)第二个要求。相反的是:

  

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

从两个中的一个不是5或3时起就足够了。

答案 1 :(得分:3)

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

所以在你的例子中尝试:

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

它让事情变得更具可读性,imo

答案 2 :(得分:3)

另一种熊猫方式:

df.query("a != 3 or b != 4")