2017-07-19 20 views
0

請幫我理解爲什麼「不等於」條件無法正常工作。dataframe 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 

我應該知道的邏輯條件,以避免故障再次工作正常?

+4

這邏輯否定如何工作......;) – MaxU

+1

這工作正常。你只需要刷命題邏輯,[基本邏輯連接詞](https://en.wikipedia.org/wiki/Logical_connective#Common_logical_connectives)否定,連詞,分詞和它們的「代數」特性... –

回答

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爲真,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必須不5和B不能是3。由於現在A是5而B是2的情況不符合我們的第一個條件,但它也不滿足我們的(錯誤的)第二個要求。相對的是:

A必須不爲5或B不能是3(相反的)

由於從時刻兩個中的一個不爲5或3就足夠了。

+1

謝謝你共享,代碼背後的邏輯。〜+ 1 – Wen

+1

什麼是....美麗的帖子... – MattR

+0

謝謝你的友好的話:)。 –

3

如果您嘗試過濾數據框,您可能想嘗試一些不同的東西。看看dataframe.loc

所以,在你的榜樣嘗試:

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

它使事情有點更具可讀性,海事組織

3

另一個大熊貓方式做到這一點:

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

也是一個非常有效的熊貓的方式。只是爲了將來的人在這篇文章中看到,'df.query()'使用'df.loc''「這個表達式的評估結果首先傳遞給DataFrame.loc」[這裏是Documentation](https:// pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.query.html) – MattR

+0

@MattR,這是正確的。但是掩碼將使用'pd.eval'方法來構建,這使得它有點不同。除此之外,對於那些來自SQL世界的人來說,可能會更加愉快,就像我一樣。 ;-) – MaxU

+0

絕對,+1爲可讀性,總是。 – MattR

相關問題