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

如何在Pandas compare生成的对比报告中显示主键PK列?

解决Pandas Compare结果添加主键PK的方法

核心思路

利用Pandas的多层列(MultiIndex)特性,从原DataFrame中提取对比结果对应索引的PK值,构造与compare输出结构匹配的DataFrame,再与对比结果合并并调整列顺序,即可在不改变原有报告格式的前提下加入PK列。

具体代码实现

首先修正原代码的语法错误(补全括号),再执行以下步骤:

import pandas as pd

# 原对比代码(修正括号)
newDF = df1.compare(df2, keep_equal=True, result_names=('DEV1','DEV2'))

# 1. 提取对比结果对应索引的PK值,构造多层列结构的DataFrame
# 主键在两个DataFrame中索引对应一致,取df1的PK即可
pk_data = df1.loc[newDF.index, 'PK']
pk_df = pk_data.to_frame()
# 设置列层级,与compare结果的列结构匹配(顶层为原列名,底层为'PK')
pk_df.columns = pd.MultiIndex.from_tuples([('AMOUNT_DAILY_BAL', 'PK')])

# 2. 合并PK列与原对比结果
combined_df = pd.concat([pk_df, newDF], axis=1)

# 3. 调整列顺序,确保PK在每个列组的最前面
combined_df = combined_df.reindex(
    columns=[('AMOUNT_DAILY_BAL', 'PK'), ('AMOUNT_DAILY_BAL', 'DEV1'), ('AMOUNT_DAILY_BAL', 'DEV2')],
    level=[0, 1]
)

# 查看最终结果
print(combined_df)

通用化处理(多列对比场景)

如果需要对比多个列,可通过循环自动处理每个列组:

import pandas as pd

newDF = df1.compare(df2, keep_equal=True, result_names=('DEV1','DEV2'))

# 获取所有需要对比的顶层列名
top_cols = newDF.columns.get_level_values(0).unique()
combined_list = []

for col in top_cols:
    # 构造当前列组的PK列
    pk_col = df1.loc[newDF.index, 'PK'].to_frame()
    pk_col.columns = pd.MultiIndex.from_tuples([(col, 'PK')])
    # 获取当前列组的对比结果
    compare_part = newDF[col]
    # 合并当前列组的PK与对比结果
    combined_part = pd.concat([pk_col, compare_part], axis=1)
    combined_list.append(combined_part)

# 合并所有列组的结果
final_result = pd.concat(combined_list, axis=1)
print(final_result)

效果验证

执行后输出的结果将与你期望的格式完全一致,每个列组下都会先显示PK值,再展示DEV1和DEV2的差异数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:23:22