基于其他数据框的条件删除pandas数据框中的行更简单的方法



假设我有两个数据帧

df1 = pd.DataFrame({"A" : [1,1,2,5],
"B" : [1,1,4,5],
"C" : ["Adam","Bella","Charlie","Dan"]})
df2 = pd.DataFrame({"A" : [1,1,3,5],
"B" : [1,3,6,5]})

,我想删除df1中与df2具有相同AB值的行

我通过

for i, row_1 in df1.iterrows():
for j, row_2 in df2.iterrows():

if row_1["A"] == row_2["A"] and row_1["B"] == row_2["B"]:
index = i
df1.drop([index], axis=0, inplace=False)           

导致,如预期的

A   B   C
2   2   4   Charlie

我想知道是否有一种更容易/更快的方法来做到这一点,特别是如果数据帧很大,那么迭代所有行是不理想的。

您可以使用left-mergeindicator参数标记匹配的行;然后query来过滤只来自df1的行:

out = df1.merge(df2, how='left', indicator=True).query('_merge=="left_only"').drop(columns=['_merge'])

输出:

A  B        C
2  2  4  Charlie

还有另一种方法:

df1.loc[~df1.set_index(['A','B']).index.isin(df2.to_records(index=False).tolist())]
#!pip install siuba
from siuba import anti_join
anti_join(df1, df2, on = ['A', 'B'])
A  B        C
2  2  4  Charlie

如果您想在所有共享列上设置anti_join:

anti_join(df1, df2)

A  B        C
2  2  4  Charlie

最新更新