Pandas比较两个DataFrame报错Can only compare identically-labeled如何解决
报错原因
Can only compare identically-labeled DataFrame objects报错的核心是两个DataFrame的行索引标签不完全匹配:你已经对齐了列的顺序和名称,但因为bru2比bru多了一行测试数据,两者的行索引长度不同,就算长度一致如果索引标签顺序/值不匹配,也会触发该报错,用==直接比较要求行、列的标签必须完全一致才能执行。
解决方案
1. 快速校验两个DataFrame是否完全一致
直接用Pandas内置的equals()方法,不需要行列标签完全对齐也能返回正确的布尔校验结果,不会触发报错:
# 完全一致返回True,有差异返回False is_same = bru.equals(bru2)
如果返回True就不需要后续的差异排查操作。
2. 排查新增行与变更单元格
从你给出的字段来看address_id是地址唯一标识,用该字段作为索引对齐两行,即可避免行索引不匹配的问题:
步骤1:设置唯一键为索引对齐数据
# 用address_id作为行索引,对齐两个表的行 bru_idx = bru.set_index("address_id") bru2_idx = bru2.set_index("address_id")
步骤2:提取新增行
新增行就是只存在于bru2中、不存在于bru中的address_id对应的行:
new_rows = bru2_idx[~bru2_idx.index.isin(bru_idx.index)].reset_index()
步骤3:提取值变更的单元格
# 对齐两个表的行和列,缺失值填充为空 aligned_bru, aligned_bru2 = bru_idx.align(bru2_idx, fill_value="") # 生成差异掩码,值不同的位置为True diff_mask = aligned_bru != aligned_bru2 # 提取所有差异单元格的信息 diff_result = diff_mask.stack()[diff_mask.stack()].reset_index() diff_result.columns = ["address_id", "字段名", "是否差异"] # 补充原值和修改后的值 diff_result["原值"] = diff_result.apply(lambda x: aligned_bru.loc[x["address_id"], x["字段名"]], axis=1) diff_result["修改后值"] = diff_result.apply(lambda x: aligned_bru2.loc[x["address_id"], x["字段名"]], axis=1)
注意:如果你不需要按唯一键对齐,只想按行的物理顺序逐行比较,可以先重置两个表的索引为默认连续整数再操作,但是如果新增行不是在末尾插入,会导致后续所有行的比较错位,不推荐该方式:
bru_reset = bru.reset_index(drop=True) bru2_reset = bru2.reset_index(drop=True) # 现在可以直接用 == 比较 diff = bru_reset == bru2_reset
内容的提问来源于stack exchange,提问作者Yorbjörn
相关产品推荐
相关产品推荐

