Pandas如何单独重命名DataFrame中重复的同名/空列头
Pandas 重复列名单独修改与空列名向前填充方案
问题原因
df.rename()方法是按列名的值做匹配替换的,只要列名的值和传入字典的key相等,无论列在什么位置都会被统一修改。当存在多个同名列(包括列名为NaN的未命名列)时,就会出现一次修改所有同名列的情况,无法实现按位置单独修改。
之前编写的for循环未生效有两个核心问题:
- 依然使用
rename做值匹配替换,绕不开同值批量修改的逻辑 df.rename()默认返回新对象,不修改原DataFrame,执行结果未重新赋值给df
实现方案
所有需要按位置修改列名的场景,不要用rename,直接操作df.columns对象即可——df.columns是按列的位置顺序存储的,每个位置的列名独立,不会因为值重复触发批量修改。
针对需要的「空列名向前填充最近的非空列名,无前置非空列名时保留NaN」的需求,不需要手写循环,直接用pandas内置的向前填充方法ffill()就能实现,自动适配任意列数、任意列名取值的场景,不需要提前预知列信息。
完整示例代码
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame( data=[[1,2,3,4,5,6,7,8], [9,10,11,12,13,14,15,16]], columns=[np.nan, np.nan, 'a', np.nan, np.nan, 'b', np.nan, np.nan] ) # 对列名做向前填充,直接赋值给df.columns完成修改 df.columns = pd.Series(df.columns).ffill()
执行后列名输出为:
Index([nan, nan, 'a', 'a', 'a', 'b', 'b', 'b'], dtype='object')
完全匹配预期的最终效果。
单独修改指定位置列名的方法
如果需要单独修改某一个位置的重复列名,直接按索引修改列名列表即可,比如修改索引为1(第二列)的列名为word:
# 将列名转为可修改的列表 col_list = df.columns.tolist() # 按位置修改指定列名 col_list[1] = 'word' # 赋值回df.columns完成修改 df.columns = col_list
执行后只会修改第二列的列名,不会影响其他值为NaN的列。
内容的提问来源于stack exchange,提问作者Zia Kim
相关产品推荐
相关产品推荐

