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

如何合并两个Python DataFrame?保留原表信息并更新重复项

用第二个DataFrame更新补充基准DataFrame的最优方案

需求明确:保留基准DataFrame(df_1)的原有未重复记录,用第二个DataFrame(df_2)的信息覆盖重复Name对应的字段值,同时添加df_2中新增的Name记录。

步骤1:修正并创建DataFrame

你提供的字典中名字未加引号,这会导致运行错误,需修正为字符串格式:

import pandas as pd

df_1 = pd.DataFrame({
  "Name": ["Tom", "Daniel", "Anne", "Isabel"],
  "Age": [50, 40, 45, 25],
  "Height": [170, 180, 190, 200]
})

df_2 = pd.DataFrame({
  "Name": ["Tom", "Daniel", "Mike"],
  "Age": [55, 70, 80],
  "Height": [210, 190, 160]
})

最优方案:使用combine_first方法

这个方法专门用于实现“用一个DataFrame的非空值补充/更新另一个DataFrame”的需求,逻辑最清晰:

# 将Name设为索引,实现按姓名匹配
df1_indexed = df_1.set_index('Name')
df2_indexed = df_2.set_index('Name')

# 优先使用df2的字段值,df2没有的记录则保留df1的内容
df3_indexed = df2_indexed.combine_first(df1_indexed)

# 重置索引,恢复Name为普通列
df_3 = df3_indexed.reset_index()

# 可选:保持原df1的记录顺序,新增记录放在末尾
original_names = df_1['Name'].tolist()
df_3 = df_3.loc[df_3['Name'].isin(original_names)].append(df_3.loc[~df_3['Name'].isin(original_names)])
df_3 = df_3.reset_index(drop=True)

执行后得到的df_3完全符合预期:

Name  Age  Height
0      Tom   55     210
1   Daniel   70     190
2     Anne   45     190
3   Isabel   25     200
4     Mike   80     160

备选方案:合并后去重

如果偏好更直观的合并逻辑,也可以用concat+drop_duplicates实现:

# 将df2放在前面合并,确保去重时保留df2的更新值
combined = pd.concat([df_2, df_1])
# 按Name去重,保留第一个出现的记录(即df2的内容)
df_3 = combined.drop_duplicates(subset='Name', keep='first')

# 同样可选:调整顺序匹配预期
original_names = df_1['Name'].tolist()
new_names = [name for name in combined['Name'].unique() if name not in original_names]
df_3 = df_3.loc[original_names + new_names].reset_index(drop=True)

方案对比

  • combine_first:语义更贴合需求,无需关注合并顺序,代码可读性更高,是最优选择。
  • 合并去重:逻辑更易理解,但需要注意合并顺序和去重参数,适合快速验证场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:20:48