You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个DataFrame并提取第一个中不存在于第二个的行

Pandas 提取第一个DataFrame中未在第二个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:39:19