2016-08-22 38 views
-1

這看起來很簡單,但我似乎無法弄清楚。我知道如何過濾熊貓數據框到符合條件的所有行,但是當我想要相反的時候,我總是收到奇怪的錯誤。在不符合條件的所有行上過濾熊貓數據框

這裏是例子。 (背景:一個簡單的棋盤遊戲,其中作品是在網格上,我們正在試圖給它一個座標,並返回所有相鄰塊,但不是實際的實際工件座標)

import pandas as pd 
import numpy as np 

df = pd.DataFrame([[5,7, 'wolf'], 
       [5,6,'cow'], 
       [8, 2, 'rabbit'], 
       [5, 3, 'rabbit'], 
       [3, 2, 'cow'], 
       [7, 5, 'rabbit']], 
       columns = ['lat', 'long', 'type']) 

coords = [5,7] #the coordinate I'm testing, a wolf 

view = df[((coords[0] - 1) <= df['lat']) & (df['lat'] <= (coords[0] + 1)) \ 
    & ((coords[1] - 1) <= df['long']) & (df['long'] <= (coords[1] + 1))] 

view = view[not ((coords[0] == view['lat']) & (coords[1] == view['long'])) ] 

print(view) 

我以爲not應該否定隨後括號內的布爾值,但這似乎不是它的工作原理。

我希望它能夠在5,6的時候返回牛,但不是5,7的狼(因爲這是當前的作品)。只是爲了仔細檢查我的邏輯,我做了

me = view[(coords[0] == view['lat']) & (coords[1] == view['long'])] 
print(me) 

並且這只是回報狼,正如我所料。那麼,爲什麼我不能只把not放在那個前面,並得到其他一切呢?或者,更重要的是,我該如何去做其他事情。

回答

1

由於numpy(因此pandas)使用按位運算符,所以應該用代替not。這也是您使用&而不是and的原因。

import pandas as pd 

df = pd.DataFrame({'a': [1, 2]}) 

print(df[~(df['a'] == 1)]) 
>> a 
    1 2 

和使用例如:

import pandas as pd 
import numpy as np 

df = pd.DataFrame([[5,7, 'wolf'], 
       [5,6,'cow'], 
       [8, 2, 'rabbit'], 
       [5, 3, 'rabbit'], 
       [3, 2, 'cow'], 
       [7, 5, 'rabbit']], 
       columns = ['lat', 'long', 'type']) 

coords = [5,7] #the coordinate I'm testing, a wolf 

view = df[((coords[0] - 1) <= df['lat']) & (df['lat'] <= (coords[0] + 1)) \ 
    & ((coords[1] - 1) <= df['long']) & (df['long'] <= (coords[1] + 1))] 

view = view[~ ((coords[0] == view['lat']) & (coords[1] == view['long'])) ] 

print(view) 
>> lat long type 
    1 5  6 cow 
+0

是的!謝謝。我也嘗試過使用'!',因爲我認爲這樣的事情可能會發生,但我還是有點偏離。再次感謝。 – seth127