这里有一个玩具的例子,抓住了我的问题。有什么帮助吗?谢谢!

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],……]

最佳答案

这感觉就像在我们可以挥手的时候发射大炮,但是:

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]

07-26 00:00
查看更多