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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:12:06