【问题标题】:filter a pandas data frame on all rows that do NOT meet a condition [duplicate]在不满足条件的所有行上过滤熊猫数据框[重复]
【发布时间】:2016-12-28 23:03:11
【问题描述】:

这似乎很简单,但我似乎无法弄清楚。我知道如何将 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)

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

我希望它在 5,6 时返回母牛,而不是在 5,7 时返回狼(因为这是当前部分)。只是为了仔细检查我的逻辑,我做了

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

正如我所料,这只返回了狼。那么为什么我不能在它前面放一个not 并得到其他所有东西呢?或者,更重要的是,我该怎么做才能得到其他一切。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    由于numpy(因此pandas)使用按位运算符,您应该将not 替换为~。这也是您使用&amp; 而不是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
    

    【讨论】:

    • 是的!谢谢你。我也尝试过使用!,因为我认为可能会发生类似的事情,但我还是有点偏离。再次感谢。
    • 使用 .isin() 方法可以帮助处理很多项目。 df = df[~(df['my column'].isin(['item1','item2']))]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2017-11-20
    • 2020-11-09
    • 2021-04-27
    • 2022-07-22
    • 2019-09-06
    相关资源
    最近更新 更多