如何拼接含重复列名的pandas DataFrame并按规则重命名重复列
可复现示例数据
import pandas as pd import numpy as np cols1=['b','a','c','a'] data1=[0,0,0,0] df1=pd.DataFrame([data1], columns= cols1) df1 cols2=['b','a', 'd', 'a', 'e','f'] data2=[1,1,1,1,1,1] df2=pd.DataFrame([data2], columns= cols2) df2
预期运行结果
data = { "b": [0, 1], "b a" : [0, 1], "c" : [0, np.NaN], "c a" : [0, np.NaN], "d" : [np.NaN, 1], "d a" : [np.NaN, 1], "e" : [np.NaN, 1], "f" : [np.NaN, 1]} pd.DataFrame(data)
问题描述
当DataFrame存在重复列名a时,直接调用pd.concat()无法完成符合预期的拼接操作。重命名规则要求:所有名为a的重复列,都以其紧邻前一列的列名为前缀,重命名为{前序列名} a的格式。
解决方案
核心思路是先按规则把所有待拼接DataFrame的列名处理为唯一值,再执行拼接,全程使用pandas原生方法即可,无额外依赖。
- 编写通用列名处理函数,遍历列序列完成重命名:遇到列名为
a的位置,自动取前一列列名拼接为新列名,其余列保留原名,保证处理后单个DataFrame内无重复列名。 - 对所有待拼接的DataFrame统一应用重命名逻辑。
- 直接调用
pd.concat()做纵向拼接,pandas会自动按列名对齐,不存在的列自动填充NaN。
完整实现代码:
def process_columns(df): raw_cols = df.columns.tolist() new_cols = [] for idx, col_name in enumerate(raw_cols): if col_name == "a": new_cols.append(f"{raw_cols[idx-1]} a") else: new_cols.append(col_name) return df.set_axis(new_cols, axis=1) # 预处理两个DataFrame的列名 df1_processed = process_columns(df1) df2_processed = process_columns(df2) # 拼接得到最终结果 result = pd.concat([df1_processed, df2_processed], ignore_index=True)
运行上述代码得到的结果和预期输出完全一致。
这个方案的优势:
- 逻辑严格匹配重命名规则,无需硬编码特定列名,不管
a列前紧邻的是b、c还是其他列名都能自动适配 - 纯pandas原生实现,性能稳定,大体积数据集也能快速处理
- 扩展性强,后续如果需要处理其他重复列,只需要修改函数内的列名判断条件即可
内容的提问来源于stack exchange,提问作者younghyun
相关产品推荐
相关产品推荐

