如何合并两个DataFrame并提取第一个中不存在于第二个的行
Pandas 提取第一个DataFrame中未在第二个DataFrame出现的行实现方案
需求说明
需要对两个DataFrame做行级差集运算,最终输出的新DataFrame仅保留属于第一个DataFrame、且所有列取值组合完全不存在于第二个DataFrame的行,输入输出参考效果如下:
- 两个输入DataFrame示例:

- 期望输出的差集结果示例:

可行实现方法
方法1:merge标记法(通用无坑,优先推荐)
这个方法逻辑最严谨,适配所有pandas版本,不会误保留第二个DataFrame独有的行,还支持自定义匹配列:
import pandas as pd # df1 为要保留数据的第一个DataFrame,df2 为用来做排除的第二个DataFrame # 做全外连接,自动生成_merge列标记每一行的来源 merge_res = df1.merge(df2, how='outer', indicator=True) # 筛选仅在df1中存在的行,删除临时标记列、重置索引即可得到结果 result = merge_res[merge_res['_merge'] == 'left_only'].drop(columns=['_merge']).reset_index(drop=True)
如果不需要按所有列匹配,只想根据某几个字段判断行是否重复,只要在merge里传入on参数指定匹配列即可,比如on=['user_id', 'order_id']就会只根据这两列判断行是否存在。
方法2:拼接去重法(写法简洁,有适用前提)
如果确认第二个DataFrame里的所有行都能在第一个DataFrame里找到,没有独有的行,可以直接用拼接+去重的写法,代码更短:
result = pd.concat([df1, df2], ignore_index=True).drop_duplicates(keep=False)
注意:如果df2存在df1里没有的独有行,这些行也会被保留在结果里,不符合需求,使用前要确认数据场景。
方法3:集合差集法(小数据量速度快)
如果数据量不大、所有列的值都是可哈希类型(数字、字符串、时间等,没有列表/字典这类可变类型),可以直接转集合求差集,运行速度很快:
# 将两个DataFrame的行转为元组集合,直接求差集 df1_rows = set(map(tuple, df1.to_numpy())) df2_rows = set(map(tuple, df2.to_numpy())) result = pd.DataFrame(list(df1_rows - df2_rows), columns=df1.columns)
注意:这个方法会丢失原df1的行排列顺序,如果对结果顺序有要求不要用。
内容的提问来源于stack exchange,提问作者eleni.ps
相关产品推荐
相关产品推荐

