基于主键关联识别非同源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
- 方式二:
mergeindicator参数反向操作
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
相关产品推荐
相关产品推荐

