2016-08-22 6 views
-1

これは簡単ですが、わかりません。私はパンダのデータフレームを条件を満たすすべての行にフィルタリングする方法を知っていますが、その逆が欲しいときは奇妙なエラーが続きます。条件を満たさないすべての行のパンダデータフレームをフィルタリングします

これは例です。 (コンテキスト:ピースがグリッド上にあり、我々はそれを与えるためにしようとしているシンプルなボードゲーム座標と隣接するすべてのピースを返すではなく、実際に実際の作品は、座標)私はnotを考え

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) 

それに続くカッコ内のブール値を否定するだけですが、これはどのように動作するかはわかりません。

私は5,6で牛を返すが、5,7で狼ではない(これは現在の作品なので)。私のロジックを二重にチェックするだけでしたが、私はしました

これはちょうど私が期待したようにオオカミを返しました。だから、私はちょうどその前に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

関連する問題