如何合并两个有重叠列的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
相关产品推荐
相关产品推荐

