根据另一个数据帧的条件删除 pandas 数据帧中的行的更简单方法

Easier way of deleting rows in pandas dataframe based on condition from another dataframe

假设我有两个数据帧

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]})

我想删除 df1ABdf2

具有相同值的行

我通过

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

我想知道是否有很多 easier/faster 方法可以做到这一点,尤其是当数据框很大时,遍历所有行并不理想。

您可以 left-merge 使用 indicator 参数来标记匹配的行;然后 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