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

基于主键关联识别非同源DataFrame的差异行

Pandas DataFrame 主键关联差异分析

先给出原始数据代码:

import pandas as pd

data = {'A': ['123','456','789'], 'B': ['D1','D4','D7'], 'C':['D2','D5','D8'], 'D':['D3','D6','D9']}
df1 = pd.DataFrame(data)

data2 = {'A': ['123','789','111','222'], 'B': ['D1','D7','D11','D14'], 'C':['D10','D8','D12','D15'], 'D':['D3','D9','D13','16']}
df2 = pd.DataFrame(data2)

1. 获取df1中存在但df2中不存在的行

两种实现方式:

  • 方式一:直接通过isin筛选主键
df1_only = df1[~df1['A'].isin(df2['A'])]
print(df1_only)

输出结果:

A   B   C   D
1  456  D4  D5  D6
  • 方式二:用merge的indicator参数,保留完整列映射
df_merge = df1.merge(df2, on='A', how='left', indicator=True)
df1_only = df_merge[df_merge['_merge'] == 'left_only'].drop(columns=['B_y', 'C_y', 'D_y', '_merge']).rename(columns={'B_x':'B', 'C_x':'C', 'D_x':'D'})
print(df1_only)

输出和方式一一致。

2. 获取df2中存在但df1中不存在的行

同样两种方式:

  • 方式一:isin反向筛选
df2_only = df2[~df2['A'].isin(df1['A'])]
print(df2_only)

输出结果:

A    B    C    D
2  111  D11  D12  D13
3  222  D14  D15   16
  • 方式二:merge indicator参数反向操作
df_merge = df2.merge(df1, on='A', how='left', indicator=True)
df2_only = df_merge[df_merge['_merge'] == 'left_only'].drop(columns=['B_y', 'C_y', 'D_y', '_merge']).rename(columns={'B_x':'B', 'C_x':'C', 'D_x':'D'})
print(df2_only)

输出和方式一一致。

3. 获取主键相同但列值有差异的行

  • 方式一:合并后逐列对比筛选
# 合并两个DataFrame,给重复列加后缀区分
df_common = df1.merge(df2, on='A', suffixes=('_df1', '_df2'))
# 筛选任意列值不同的行
diff_rows = df_common[
    (df_common['B_df1'] != df_common['B_df2']) |
    (df_common['C_df1'] != df_common['C_df2']) |
    (df_common['D_df1'] != df_common['D_df2'])
]
print(diff_rows)

输出结果:

A B_df1 C_df1 D_df1 B_df2 C_df2 D_df2
0  123    D1    D2    D3    D1   D10    D3
  • 方式二:用compare方法直观展示差异(需Pandas 1.1.0及以上版本)
df_compare = df1.set_index('A').compare(df2.set_index('A'))
print(df_compare)

输出结果:

C     
    self other
A            
123   D2   D10

清晰展示A=123的行中C列的差异值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:40:28