这里有一个玩具的例子,抓住了我的问题。有什么帮助吗?谢谢!
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]