请帮助我理解为什么“不等于”条件无效。
>>>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
我应该了解哪些逻辑条件可以避免失败?
答案 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")