对比两个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
相关产品推荐
相关产品推荐

