合并两个DataFrame时如何合并重复列且避免索引重复?
解决方案:合并DataFrame时自动合并重复列
我完全懂你的困扰——沿axis=1合并DataFrame时,相同列名会被拆成多列(比如示例里的两个B列),而直接用axis=0又会导致索引重复,破坏你需要的结构。
这里有个简洁且通用的方法,能完美解决你的问题:对合并后的DataFrame按列名分组,然后提取每行的第一个非空值。
核心代码逻辑
针对你提供的复杂场景,只需要在最后一步添加一行代码,就能把重复列合并成单一列:
df4 = df4.groupby(df4.columns, axis=1).first()
完整可运行示例
import pandas as pd # 构建初始数据 dic={'A':['1','2','3'], 'B':['10','11','12']} df1=pd.DataFrame(dic) df1.set_index('A', inplace=True) dic2={'A':['4','5','6'], 'B':['10','11','12']} df2=pd.DataFrame(dic2) df2.set_index('A', inplace=True) # 按axis=1合并df1和df2 df=pd.concat([df1,df2], axis=1) # 加入带C列的df3并合并 dic3={'A':['1','2','3'], 'C':['20','21','22']} df3=pd.DataFrame(dic3) df3.set_index('A', inplace=True) df4=pd.concat([df,df3], axis=1) # 关键步骤:合并重复列 df4 = df4.groupby(df4.columns, axis=1).first() print(df4)
运行结果
B C A 1 10 20.0 2 11 21.0 3 12 22.0 4 10 NaN 5 11 NaN 6 12 NaN
原理说明
groupby(df4.columns, axis=1):把所有列按列名分组,相同列名的列会被分到同一组(比如两个B列会成为一组)。.first():对每组的每行,提取第一个非空值。因为你的场景里同一索引下的重复列只有一个有值(另一个是NaN),这个操作正好把两列的有效值合并到单一列中。
扩展适配
如果你的重复列中存在同一索引下多列都有值的情况,可以根据业务需求替换first()为其他聚合函数:
- 求和用
sum() - 取平均值用
mean() - 取最大值用
max()
内容的提问来源于stack exchange,提问作者Jcb Rb
相关产品推荐
相关产品推荐

