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

对比两个Pandas DataFrame报错,求三类差异记录提取方法

Pandas DataFrame 跨库数据差异提取方案

错误原因

你遇到的「Can only compare identically-labeled DataFrame objects」错误,是因为直接通过dif1['NAME'] == dif2['NAME']这类方式对比列时,Pandas会强制要求两个DataFrame的索引完全一致、行数相同才能逐行匹配对比。但你的两个DataFrame来自不同数据库,行数和索引大概率不匹配,且这种逐行对比的逻辑本身不符合你按NAME+ID组合匹配的需求,因此触发错误。

三类差异记录的提取实现

先准备与你给出结构一致的示例数据:

import pandas as pd

dif1 = pd.DataFrame({
    'NAME': ['TMPA4', 'TMPA7', 'TMPA4', 'TMPA2', 'TMPA4'],
    'VALUE': [1, 8, 4, 6, 2],
    'ID': ['009450', '009452', '009463', '009674', '009456']
})

dif2 = pd.DataFrame({
    'NAME': ['TMPA4', 'TMPA9', 'TMPA4'],
    'VALUE': [1, 3, 1],
    'ID': ['009450', '009674', '009674']
})

1. 双方均存在且NAME+ID相同但VALUE不同的记录

通过merge按NAME+ID做内连接,再筛选VALUE不等的行:

# 内连接保留两边都有的NAME+ID组合,对比两个VALUE列
merged = pd.merge(dif1, dif2, on=['NAME', 'ID'], suffixes=('_dif1', '_dif2'), how='inner')
diff_value_records = merged[merged['VALUE_dif1'] != merged['VALUE_dif2']]
print("双方存在但VALUE不同的记录:")
print(diff_value_records)

2. 仅在dif1中存在的NAME+ID记录

用左连接结合_merge标记筛选:

# 左连接保留dif1所有行,筛选仅dif1存在的记录
only_dif1 = pd.merge(dif1, dif2, on=['NAME', 'ID'], how='left', indicator=True)
only_dif1 = only_dif1[only_dif1['_merge'] == 'left_only'].drop('_merge', axis=1)
print("\n仅在dif1中存在的记录:")
print(only_dif1)

3. 仅在dif2中存在的NAME+ID记录

用右连接结合_merge标记筛选:

# 右连接保留dif2所有行,筛选仅dif2存在的记录
only_dif2 = pd.merge(dif1, dif2, on=['NAME', 'ID'], how='right', indicator=True)
only_dif2 = only_dif2[only_dif2['_merge'] == 'right_only'].drop('_merge', axis=1)
print("\n仅在dif2中存在的记录:")
print(only_dif2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:07:05