首页 > 解决方案 > 如何通过对两列施加的多个标准删除 Pandas 数据框中的行?

问题描述

这是一个捕捉我的问题的玩具示例。请问有什么帮助吗?谢谢!

d = {'a': [1,1,1,2,2,2,3,3,3],
     'b': [1,2,3,1,2,3,1,2,3]}

df = pd.DataFrame(d)

针对这个结果:

我想用 (a,b) = (1,3) 或 (2,1) 删除两行。

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

实际上,我会有一个随时间更新的排除列表: excl = [[1,3],[2,1],[3,4],........]

标签: pythonpandas

解决方案


当我们应该能够挥手时,这感觉就像发射大炮,但是:

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

excl = [[1, 3], [2, 1]]
keep = df.merge(pd.DataFrame(excl, columns=['a','b']),
                how='left', indicator=True)._merge == 'left_only'

给我

In [91]: df.loc[keep]
Out[91]: 
   a  b
0  1  1
1  1  1
2  1  2
5  2  2
6  2  3
7  3  1
8  3  2
9  3  3

(注意,出于理智的目的,我添加了重复的 1,1 行。)

疯狂的方法#2:(有效地)使用分类编码:

codes = pd.concat([df, edf], sort=False).groupby(["a","b"]).ngroup()
keep = ~codes.iloc[:len(df)].isin(codes.iloc[len(df):])
df = df.loc[keep]

推荐阅读