Python pandas merge后列名带单引号 执行rename重命名操作报错如何解决
问题原因
- 你看到的带单引号的列名本质不是字符串,是多级列索引(MultiIndex),每一个列名都是元组格式。你把元组转成字符串作为rename的匹配key,和实际列名类型不匹配,自然找不到对应列,重命名完全不生效。出现该情况大概率是merge的其中一个输入DataFrame之前做过groupby聚合操作,agg聚合时默认生成了多级列索引,merge时直接保留了该结构,打印时pandas把元组转为字符串展示才会看到单引号。
- 代码存在语法错误:使用
inplace=True参数时,rename方法的返回值为None,你把返回值赋值给data_renamed后调用dtype会直接报错,因为None对象没有该属性。
解决方法
步骤1:验证列索引类型
先执行以下代码确认是否为多级索引:
print(type(data.columns)) print(data.columns)
如果输出包含<class 'pandas.core.indexes.multi.MultiIndex'>即可确认问题根因。
步骤2:正确执行重命名
直接用元组作为匹配key即可,根据使用习惯选择以下两种写法之一:
写法1:不使用inplace,直接接收新DataFrame
data_renamed = data.rename(columns={ ('MonthCompletionXWSWeighting', 'sum'): "MonthCompletionXWSWeighting", ('Actual / Plan', ''): "Actual / Plan", ('Month', ''): "Month", ('#', ''): "#" }) # 验证重命名结果 print(data_renamed.columns)
写法2:使用inplace,不做变量赋值
data.rename(columns={ ('MonthCompletionXWSWeighting', 'sum'): "MonthCompletionXWSWeighting", ('Actual / Plan', ''): "Actual / Plan", ('Month', ''): "Month", ('#', ''): "#" }, inplace=True) # 验证重命名结果 print(data.columns)
可选:批量拍平多级列索引
如果需要处理的列很多,不想逐个写映射规则,可以批量将多级索引转为单级:
# 规则:第二层索引非空则拼接,为空直接取第一层 data.columns = [f"{col[0]}_{col[1]}" if col[1] else col[0] for col in data.columns] # 如果只需要保留第一层索引,写法更简单 data.columns = data.columns.get_level_values(0)
内容的提问来源于stack exchange,提问作者v-jh
相关产品推荐
相关产品推荐

