Python中合并含重复索引DataFrame并以新值覆盖旧值的实现方法
实现方案
以下所有方法都可以实现你需要的合并逻辑:重复索引优先保留后一个DataFrame(df2)的取值,自动合并所有索引。
你提供的示例数据如下:
import pandas as pd df1 = pd.DataFrame({'values': [1, 2, 3]}, index=['a', 'b', 'c']) df2 = pd.DataFrame({'values': [4, 5, 6]}, index=['c', 'd', 'e'])
方法1:使用combine_first(最简洁)
该方法会自动取两个DataFrame的索引并集,优先保留调用方法的对象的非空值,空缺位置用参数传入的DataFrame的值填充,符合你需要的优先级逻辑。
# df2优先级更高,所以用df2调用方法,传入df1 result = df2.combine_first(df1) # 如果需要固定索引顺序可加下一行,默认返回按字母排序的索引 result = result.reindex(['a','b','c','d','e'])
输出结果:
values a 1 b 2 c 4 d 5 e 6
方法2:使用concat + 索引去重(适合多DataFrame合并场景)
先按「优先级从低到高」的顺序拼接所有DataFrame,再按索引去重,保留最后出现的取值即可,适合2个以上DataFrame批量合并的场景。
concat_df = pd.concat([df1, df2]) # keep='last'表示重复索引保留最后出现的那行 result = concat_df.loc[~concat_df.index.duplicated(keep='last')] # 按字母排序索引 result = result.sort_index()
方法3:使用reindex + fillna(逻辑最直观)
先取两个DataFrame的索引并集,再用df2重索引到这个并集,空缺位置用df1填充,逻辑易懂便于自定义调整。
# 取两个索引的并集 union_index = df1.index.union(df2.index) # 用df2优先填充,空缺部分补df1的取值 result = df2.reindex(union_index).fillna(df1)
注意事项
- 所有方法默认返回按字母排序的索引,如果需要自定义顺序可以用
reindex指定目标索引列表即可 - 如果两个DataFrame有多个列,上述方法会自动按列名匹配处理,不需要额外调整
内容的提问来源于stack exchange,提问作者tcordeviola
相关产品推荐
相关产品推荐

