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

基于id匹配将df2指定列值更新至df1对应列

基于ID匹配更新Pandas DataFrame的指定列

问题背景

现有两个Pandas DataFrame:df1和df2,数据如下:

df1原始数据

idGroupFamilyBonus
1tri23_1LaavinA
2hsgç_T2GrendyB
3bbbj-1Y_jnFantolC
4hsgç_T2GondowD

df2原始数据

idGroupFamilyBonus
1triBrendyB
2hsgç_T2FantolA
5bbbj-1Y_jnFantolE
6hsgç_T3GondowD

需求:当df1中的id在df2中存在时,将df2对应的Group、Family、Bonus列值覆盖到df1的对应列,最终得到如下结果:

预期更新后的df1

idGroupFamilyBonus
1triBrendyB
2hsgç_T2FantolA
3bbbj-1Y_jnFantolC
4hsgç_T2GondowD

解决方案

方法一:使用merge + update(推荐,适合大数据量)

利用Pandas的update方法,通过索引匹配实现高效更新:

import pandas as pd

# 构造原始DataFrame
df1 = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'Group': ['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2'],
    'Family': ['Laavin', 'Grendy', 'Fantol', 'Gondow'],
    'Bonus': ['A', 'B', 'C', 'D']
})

df2 = pd.DataFrame({
    'id': [1, 2, 5, 6],
    'Group': ['tri', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T3'],
    'Family': ['Brendy', 'Fantol', 'Fantol', 'Gondow'],
    'Bonus': ['B', 'A', 'E', 'D']
})

# 筛选df2中存在于df1的id,提取需要更新的列并设置id为索引
update_source = df2[df2['id'].isin(df1['id'])].set_index('id')[['Group', 'Family', 'Bonus']]

# 将df1设置为id索引,执行更新后恢复原索引
df1 = df1.set_index('id')
df1.update(update_source)
df1 = df1.reset_index()

# 输出结果
print(df1)

说明:update方法会自动匹配相同索引的行,仅用非空值覆盖目标DataFrame,不会修改df1中不存在于df2的行。

方法二:使用loc直接定位赋值(直观,适合小数据量)

通过遍历需要更新的行,直接定位df1的对应行进行赋值:

import pandas as pd

# 构造原始DataFrame(同方法一)
df1 = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'Group': ['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2'],
    'Family': ['Laavin', 'Grendy', 'Fantol', 'Gondow'],
    'Bonus': ['A', 'B', 'C', 'D']
})

df2 = pd.DataFrame({
    'id': [1, 2, 5, 6],
    'Group': ['tri', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T3'],
    'Family': ['Brendy', 'Fantol', 'Fantol', 'Gondow'],
    'Bonus': ['B', 'A', 'E', 'D']
})

# 遍历df2中需要更新到df1的行
for _, row in df2[df2['id'].isin(df1['id'])].iterrows():
    # 定位df1中对应id的行,更新指定列
    df1.loc[df1['id'] == row['id'], ['Group', 'Family', 'Bonus']] = row[['Group', 'Family', 'Bonus']]

# 输出结果
print(df1)

说明:这种方式逻辑清晰,容易理解,但遍历行的效率较低,适合数据量较小的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:40:14