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

如何对比列不同的两个DataFrame,仅基于共同列获取差异?

对比列子集的DataFrame并获取差异行

方法一:基于元组匹配筛选

先提取两个DataFrame的共同列,将这些列的每行转为元组,通过判断元组是否存在于df1中来筛选df2的差异行:

import pandas as pd

# 构建示例数据
df1 = pd.DataFrame({
    'Date': ['2013-11-24']*4,
    'Fruit': ['Banana', 'Orange', 'Apple', 'Celery'],
    'Num': [22.1, 8.6, 7.6, 10.2],
    'Color': ['Yellow', 'Orange', 'Green', 'Green']
})

df2 = pd.DataFrame({
    'Date': ['2013-11-24']*4 + ['2013-11-25']*2,
    'Fruit': ['Banana', 'Orange', 'Apple', 'Celery', 'Apple', 'Orange'],
    'Num': [22.1, 8.6, 7.6, 10.2, 22.1, 8.6],
    'Color': ['Yellow', 'Orange', 'Green', 'Green', 'Red', 'Orange'],
    'A': [1,2,3,4,5,6]
})

# 获取共同列
common_cols = df1.columns.tolist()

# 筛选df2中在共同列上不存在于df1的行
diff_result = df2[~df2[common_cols].apply(tuple, axis=1).isin(df1.apply(tuple, axis=1))]

print(diff_result)

输出结果:

Date   Fruit   Num   Color  A
4  2013-11-25   Apple  22.1     Red  5
5  2013-11-25  Orange   8.6  Orange  6

方法二:使用merge(更适合大数据量)

利用merge的indicator参数可以更高效地完成对比,避免逐行转元组的性能损耗:

# 左连接两个DataFrame,保留df2的全部行
merged_df = df2.merge(df1, on=common_cols, how='left', indicator=True)

# 筛选仅存在于df2的行,移除辅助列
diff_result = merged_df[merged_df['_merge'] == 'left_only'].drop(columns='_merge')

print(diff_result)

该方法输出结果与方法一完全一致,且在处理大规模数据时性能更优。

内容的提问来源于stack exchange,提问作者test tes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:45:34