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

Python中如何对比行列数不同的两个DataFrame的差异?

对比行列数不同的DataFrame差异(基于Pk列)

需求概述

需要对比两个行列数不同的DataFrame,两者均包含Pk列作为匹配键,且Schema预先未知。最终输出仅保留存在差异值的行和列的新DataFrame,遵循以下规则:

  • 共同列中数据完全一致的行直接排除
  • 仅在单个DataFrame中存在的列排除
  • 所有行数据均一致的共同列排除

示例数据

预期DataFrame(df_expected)

pkcolumn1amount1amount2
1A11101
2B12102
3C13103
4D14104

实际DataFrame(df_actual)

pkcolumn1extra_columnamount1amount2
1AAA11101
2BBB12102
3CCC13.1103
4DDD14104.1

目标输出(df_output)

pkamount1amount2
3Actual: 13.1, Expected: 13
4Actual: 104.1, Expected: 104

实现代码

import pandas as pd

def compare_dataframes(df_expected, df_actual, pk_col='pk'):
    # 以Pk列为键合并两个DataFrame,只保留双方都有的行
    merged = pd.merge(df_expected, df_actual, on=pk_col, suffixes=('_expected', '_actual'), how='inner')
    
    # 提取所有共同列(排除Pk列)
    common_cols = [col.split('_expected')[0] for col in merged.columns if '_expected' in col]
    
    # 构建差异结果字典
    diff_results = {pk_col: merged[pk_col]}
    for col in common_cols:
        exp_col = f"{col}_expected"
        act_col = f"{col}_actual"
        # 标记当前列的差异行
        has_diff = merged[exp_col] != merged[act_col]
        # 生成差异描述文本,无差异则为空
        diff_text = merged.apply(
            lambda row: f"Actual: {row[act_col]}, Expected: {row[exp_col]}" if has_diff.loc[row.name] else "",
            axis=1
        )
        # 仅保留存在差异的列
        if diff_text.str.strip().any():
            diff_results[col] = diff_text
    
    # 转换为DataFrame并过滤掉无差异的行
    df_diff = pd.DataFrame(diff_results)
    df_diff = df_diff[df_diff.drop(pk_col, axis=1).apply(lambda x: x.str.strip().any(), axis=1)]
    
    return df_diff

# 测试示例数据
df_expected = pd.DataFrame({
    'pk': [1,2,3,4],
    'column1': ['A','B','C','D'],
    'amount1': [11,12,13,14],
    'amount2': [101,102,103,104]
})

df_actual = pd.DataFrame({
    'pk': [1,2,3,4],
    'column1': ['A','B','C','D'],
    'extra_column': ['AA','BB','CC','DD'],
    'amount1': [11,12,13.1,14],
    'amount2': [101,102,103,104.1]
})

df_output = compare_dataframes(df_expected, df_actual)
print(df_output)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:17:04