如何在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
相关产品推荐
相关产品推荐

