如何获取Pandas中最新DataFrame(df2)的变更行?
获取DataFrame df2中的变更行
首先定义两个示例DataFrame:
import pandas as pd df1 = pd.DataFrame({'A':[1,2,3],'B':[2,3,4]}) df2 = pd.DataFrame({'A':[1,2,4],'B':[2,2,5]})
你当前使用的pd.concat([df1, df2]).drop_duplicates(keep=False)会返回两个DataFrame的所有差异行(包含df1独有的行),要只提取df2中的变更行(包括df2新增的行、以及与df1同主键但值不同的行),可以用以下两种方法:
方法1:merge结合标记筛选
通过merge关联两个DataFrame,标记行的来源,再精准筛选df2的变更行:
# 按主键(这里假设A是唯一标识列)合并,保留双方列并标记来源 merged = df1.merge(df2, on='A', how='outer', suffixes=('_df1', '_df2'), indicator=True) # 筛选两种变更情况:df2独有的行、同A但B值不同的行 changed_df2 = merged[ (merged['_merge'] == 'right_only') | (merged['B_df1'] != merged['B_df2']) ] # 提取df2的原始列结构 changed_df2 = changed_df2[['A', 'B_df2']].rename(columns={'B_df2': 'B'})
运行结果:
A B 1 2 2 2 4 5
方法2:拆分对比+合并结果
先对比共有的主键行的差异,再合并df2的新增行:
# 找出两个DataFrame共有的A值 common_A = df1['A'].intersection(df2['A']) # 筛选df2中与df1同A但B值不同的行 changed_existing = df2[df2['A'].isin(common_A) & (df2['B'] != df1.set_index('A').loc[common_A, 'B'].values)] # 筛选df2独有的行 new_rows = df2[~df2['A'].isin(df1['A'])] # 合并两类变更行 changed_df2 = pd.concat([changed_existing, new_rows]).sort_index()
运行结果与方法1一致。
扩展说明
如果你的DataFrame有多个主键列,只需在merge的on参数中传入所有主键列(比如on=['A', 'C']),对比差异时也需要覆盖所有非主键列即可。
内容的提问来源于stack exchange,提问作者Koke Abeke
相关产品推荐
相关产品推荐

