You need to enable JavaScript to run this app. 如何合并两个DataFrame实现upsert以更新单个DataFrame的数值
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个DataFrame实现upsert以更新单个DataFrame的数值

Pandas实现DataFrame Upsert(更新插入)操作方案

Upsert逻辑为:主键匹配的行用新数据覆盖旧数据,主键不存在的行直接插入新数据,针对你的场景提供两种常用实现方案:

方案1:combine_first实现(简洁通用,全字段更新)

操作逻辑:将主键设为索引后,优先取新表df_closed的数值,旧表仅做新表缺失数据的补充,完全符合upsert的要求。
示例代码:

import pandas as pd

# 构造示例数据,实际使用时替换为你自己的df_open、df_closed
df_open = pd.DataFrame({'Primary_key': [1, 2], 'Name': ['A', 'B']})
df_closed = pd.DataFrame({'Primary_key': [1, 2, 3], 'Name': ['A', 'X', 'C']})

# 执行upsert操作
df_open = df_open.set_index('Primary_key')
df_closed = df_closed.set_index('Primary_key')
df_upsert_result = df_closed.combine_first(df_open).reset_index()

执行后得到的结果完全符合你的预期:

Primary_keyName
1A
2X
3C

方案2:merge+where实现(灵活度高,支持自定义更新规则)

适合仅需要更新部分字段、或不同字段有不同更新逻辑的场景:

# 外连接两个表,用后缀区分新旧字段
merged_df = df_open.merge(df_closed, on='Primary_key', how='outer', suffixes=('_old', '_new'))

# 优先用新表的Name值,新值为空时保留旧值
merged_df['Name'] = merged_df['Name_new'].where(merged_df['Name_new'].notna(), merged_df['Name_old'])

# 提取最终需要的字段即可
df_upsert_result = merged_df[['Primary_key', 'Name']]

适用场景说明

  • 全字段按新表覆盖旧表的场景优先用方案1,代码更简洁执行效率更高
  • 需要自定义部分字段更新规则的场景用方案2,可灵活调整逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 21:09:02