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

如何对比两个Pandas DataFrame提取指定差异行生成新DataFrame

Pandas DataFrame 差异对比需求

我有两个Pandas DataFrame,需要对比找出差异:

  • df1包含唯一ID列、文本列和数值列,每个ID仅对应一行
  • df2结构相同,但同一ID可能有多条记录
  • 需将df1中每个ID的对应列,与df2中所有匹配该ID的行对比,把差异行存入新的df3
  • 补充规则:如果df1中的ID在df2里没出现,df3不包含该行

df1 数据示例

import pandas as pd
data1 = {'ID':['L1', 'L2', 'L3', 'L4'], 'Text':['1A', '1B','1C','1D'], 'Num':[1, 2, 3, 4]}
df1 = pd.DataFrame(data1)
print(df1)
IDTextNum
L11A1
L21B2
L31C3
L41D4

df2 数据示例

data2 = {'ID':['L1', 'L2', 'L3', 'L1', 'L2', 'L3'], 'Text':['1A','1B','1C','2A','2B','1C'], 'Num':[1, 2, 3, 11,2,123]}
df2 = pd.DataFrame(data2)
print(df2)
IDTextNum
L11A1
L21B2
L31C3
L12A11
L22B2
L31C123

期望输出 df3

IDTextNum
L12A11
L22B2
L31C123

解决方案代码

通过合并+筛选的方式实现需求:

  1. 按ID合并df1和df2,保留df2的所有行并带上df1的对应值
  2. 对比Text和Num列,筛选出与df1中对应ID值不同的记录
  3. 整理为目标格式的df3
import pandas as pd

# 定义原始数据
data1 = {'ID':['L1', 'L2', 'L3', 'L4'], 'Text':['1A', '1B','1C','1D'], 'Num':[1, 2, 3, 4]}
df1 = pd.DataFrame(data1)
data2 = {'ID':['L1', 'L2', 'L3', 'L1', 'L2', 'L3'], 'Text':['1A','1B','1C','2A','2B','1C'], 'Num':[1, 2, 3, 11,2,123]}
df2 = pd.DataFrame(data2)

# 按ID合并两个DataFrame,保留df2的匹配行
merged = df2.merge(df1, on='ID', suffixes=('_df2', '_df1'), how='inner')

# 筛选出Text或Num与df1对应值不同的行
diff_mask = (merged['Text_df2'] != merged['Text_df1']) | (merged['Num_df2'] != merged['Num_df1'])
df3 = merged[diff_mask][['ID', 'Text_df2', 'Num_df2']].rename(columns={'Text_df2':'Text', 'Num_df2':'Num'})

print(df3)

运行结果:

ID Text  Num
0  L1  2A   11
1  L2  2B    2
2  L3  1C  123

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:15:11