如何对比列不同的两个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
相关产品推荐
相关产品推荐

