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

如何用Pandas通过匹配列值,从另一个DataFrame更新目标DataFrame?

用第二个DataFrame覆盖更新第一个(基于Code和Name匹配)

没问题,我来帮你搞定这个需求!要实现以第二个DataFrame为数据源,根据Code和Name两列的匹配值更新第一个DataFrame的对应行,这里给你两种实用的方案,咱们先把示例数据补全,方便演示:

import pandas as pd

# 待更新的第一个DataFrame
data1 = {
    'Code': [1, 2, 3],
    'Name': ['Company1', 'Company2', 'Company3'],
    'Value': [100, 200, 300]
}
df1 = pd.DataFrame(data1)

# 作为覆盖源的第二个DataFrame
data2 = {
    'Code': [2],
    'Name': ['Company2'],
    'Value': [1000]
}
df2 = pd.DataFrame(data2)

方案一:复合索引 + update方法

这种方法直观高效,适合直接修改原DataFrame的场景:

# 把Code和Name设为复合索引,让两个DataFrame能精准匹配
df1.set_index(['Code', 'Name'], inplace=True)
df2.set_index(['Code', 'Name'], inplace=True)

# 用df2的内容覆盖更新df1中匹配的行
df1.update(df2)

# 重置索引,恢复原来的列结构
df1.reset_index(inplace=True)

print(df1)

运行后输出结果:

Code      Name   Value
0     1  Company1   100.0
1     2  Company2  1000.0
2     3  Company3   300.0

方案二:merge + combine_first方法

如果不想修改原DataFrame的索引,或者需要更灵活的处理逻辑,可以用这种方式生成新的更新后DataFrame:

# 左连接合并两个DataFrame,保留df1的所有行,匹配df2的内容
merged_df = df1.merge(df2, on=['Code', 'Name'], how='left', suffixes=('_old', '_new'))

# 用df2的新值覆盖df1的旧值,没有匹配到新值的保留原数据
merged_df['Value'] = merged_df['Value_new'].combine_first(merged_df['Value_old'])

# 筛选出需要的列,得到最终更新后的DataFrame
updated_df = merged_df[['Code', 'Name', 'Value']]

print(updated_df)

输出结果和方案一完全一致。

小提示

  • update方法会直接修改原DataFrame(如果使用inplace=True),而merge的方式会生成新的DataFrame,不会改动原始数据,你可以根据需求选择。
  • 如果需要把df2中不存在于df1的行也新增进去,只需要把merge的how='left'改成how='outer'即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:09:18