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

如何合并两个有重叠列的Pandas DataFrame,更新已有值并添加新值

解法1:concat + 去重(最简洁)

核心逻辑是把两个表按顺序拼接后,按username去重,保留最后出现的行(也就是data2的行优先),代码如下:

import pandas as pd
data1 = pd.DataFrame([['user1',  10], ['user2', 11], ['user3',  12],['user4',10]], columns=['username', 'amount'])
data2 = pd.DataFrame([['user4', 15], ['user5', 60]], columns=['username', 'amount'])

data3 = pd.concat([data1, data2], axis=0).drop_duplicates(subset='username', keep='last').reset_index(drop=True)
print(data3)

运行结果和预期完全一致:

username  amount
0    user1      10
1    user2      11
2    user3      12
3    user4      15
4    user5      60
解法2:基于merge改造(适合需要保留合并标记的场景)

你之前的merge代码已经拿到了所有数据,只需要新增一步合并amount字段,优先取data2的值,空值用data1的值填充即可:

df_merge = data1.merge(data2, how='outer', on='username')
# 优先取data2的amount(即amount_y),空值用data1的amount_x填充
df_merge['amount'] = df_merge['amount_y'].fillna(df_merge['amount_x']).astype(int)
data3 = df_merge[['username', 'amount']].reset_index(drop=True)
解法3:set_index + update(适合索引为username的场景)

先把username设为索引,update方法会直接覆盖匹配到的行,再把data2中独有的行拼进去即可:

df1 = data1.set_index('username')
df2 = data2.set_index('username')
# 用df2的值覆盖df1中匹配的行
df1.update(df2)
# 拼接df2中不在df1里的行
data3 = pd.concat([df1, df2[~df2.index.isin(df1.index)]]).reset_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:18:03