在所有不符合条件的行上过滤熊猫数据框

set*_*127 2 python pandas

这似乎很简单,但我似乎无法弄清楚。我知道如何将熊猫数据框过滤到满足条件的所有行,但是当我想要相反时,我总是收到奇怪的错误。

这是例子。(上下文:一个简单的棋盘游戏,棋子在网格上,我们试图给它一个坐标并返回所有相邻的棋子,但不在该实际坐标上返回棋子)

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)
Run Code Online (Sandbox Code Playgroud)

我认为not应该只对后面的括号内的布尔值求反,但这似乎并不是它的工作原理。

我希望它以5,6的价格退还母牛,而不是以5,7的价格退还狼(因为这是目前的价格)。只是仔细检查我的逻辑,我做了

me = view[(coords[0] == view['lat']) & (coords[1] == view['long'])] 
print(me)
Run Code Online (Sandbox Code Playgroud)

正如我所料,这只归还了狼。那么,为什么我不能仅仅放在not前面并得到其他所有内容呢?或者,更重要的是,我应该怎么做才能获得所有其他一切。

Dee*_*ace 5

由于numpy(因此pandas)使用按位运算符,因此应替换not~。这也是您使用&而不是使用的原因and

import pandas as pd

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

print(df[~(df['a'] == 1)])
>>    a
   1  2
Run Code Online (Sandbox Code Playgroud)

并使用您的示例:

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
Run Code Online (Sandbox Code Playgroud)