基于共同索引合并DataFrame:保留B索引并覆盖重复值
解决DataFrame按索引合并并优先保留B值的问题
看起来你已经找对了方向,但用merge的时候因为列名重复导致生成了两列,其实有更直接的方法来实现你要的需求——保留B的所有索引条目,相同索引用B的值,B没有的索引用A的值。
下面给你两种简单高效的解决方案:
方法1:使用combine_first()(最贴合需求)
pandas的combine_first()方法就是专门干这个的:它会优先使用调用者(这里是df2)的数据,对于调用者中缺失的索引/列,再用传入的DataFrame(df1)的数据来补充,完美匹配你的需求!
代码示例:
import pandas as pd df1 = pd.DataFrame(index= [1, 2], data = ['1A', '2A'], columns=['col1']) df2 = pd.DataFrame(index= [1, 3], data=['1B', '3B'], columns=['col1']) # 核心代码 df3 = df2.combine_first(df1)
运行结果就是你想要的:
col1 1 1B 2 2A 3 3B
方法2:用concat + groupby
如果你偏好更直观的组合操作,可以先把两个DataFrame拼接起来,然后按索引分组,取每组的最后一条数据(因为df2在拼接顺序的后面,相同索引的最后一条就是df2的值):
代码示例:
df3 = pd.concat([df1, df2]).groupby(level=0).last()
这个方法同样能得到和上面完全一致的结果。
为什么你的merge会生成两列?
当你用merge做外连接且列名相同时,pandas会自动给来自左表(df1)的列加_x后缀,右表(df2)的列加_y后缀。如果一定要用merge实现,你可以手动合并这两列,优先取col1_y(df2的值),但这就多了一步:
merged = pd.merge(df1, df2, how='outer', left_index=True, right_index=True) df3 = merged['col1_y'].combine_first(merged['col1_x']).to_frame('col1')
显然这不如前两种方法简洁,所以更推荐前面的方案。
内容的提问来源于stack exchange,提问作者eztam
相关产品推荐
相关产品推荐

