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

DataFrame形状不同时如何使用pd.compare进行差异对比?

解决pandas compare()在非同源DataFrame下的报错并保留差异列展示优势

pd.compare()要求两个DataFrame的索引、列完全对齐,一旦存在某一方独有的记录或列,就会抛出Can only compare identically-labeled DataFrame objects错误。要解决这个问题同时保留它只展示变化列的优势,可以按以下步骤操作:

1. 对齐两个DataFrame的索引和列

先提取两个DF的所有索引和列,用reindex方法将两个DF扩展为相同形状,缺失值用NaN填充:

import pandas as pd

# 示例数据
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=[0, 1, 2])
df2 = pd.DataFrame({'A': [1, 3], 'B': [4, 7], 'C': [8, 9]}, index=[0, 2])

# 获取所有索引和列的并集
all_index = df1.index.union(df2.index)
all_columns = df1.columns.union(df2.columns)

# 对齐两个DF
df1_aligned = df1.reindex(index=all_index, columns=all_columns)
df2_aligned = df2.reindex(index=all_index, columns=all_columns)

2. 调用compare()获取列差异

对齐后的DF可以正常调用compare(),通过参数控制只保留有差异的内容:

# 获取同索引下的列差异,只展示变化项
diff_result = df1_aligned.compare(df2_aligned, keep_shape=False, keep_equal=False)
  • keep_shape=False:只保留存在差异的行和列,避免冗余
  • keep_equal=False:不显示值完全相等的列,和原生compare()的默认行为一致

3. 补充独有的记录

对齐后,某一方独有的记录在另一方中全为NaN,我们可以提取这些记录并格式化后合并到结果中:

# 提取df1独有的行(df2对应行全为NaN)
df1_only = df1_aligned[df2_aligned.isna().all(axis=1)]
# 提取df2独有的行(df1对应行全为NaN)
df2_only = df2_aligned[df1_aligned.isna().all(axis=1)]

# 格式化独有记录,统一结果格式
df1_only_formatted = df1_only.stack().rename('仅df1存在').to_frame()
df2_only_formatted = df2_only.stack().rename('仅df2存在').to_frame()

# 合并差异结果和独有记录
final_result = pd.concat([diff_result, df1_only_formatted, df2_only_formatted]).sort_index()

最终的final_result既包含了同索引下的列差异,也标注了各自独有的记录,全程只展示有变化或独有的内容,完美保留了pd.compare()的核心优势。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:47:22