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

