最稳妥写法是 df.rename(columns={'旧名': '新名'}),必须显式指定 columns= 参数,否则因参数冲突报 typeerror;列名需严格匹配,批量操作优先用 add_prefix()/add_suffix()。

rename() 方法怎么写才不报错
直接用 df.rename(columns={'旧名': '新名'}) 最稳妥,别漏掉 columns= 这个关键字参数。省略它会触发 TypeError: rename() got multiple values for argument 'axis'——因为 rename() 默认把第一个位置参数当 mapper,而你传的是 dict,又没指明是改列,pandas 就懵了。
常见错误现象:只写 df.rename({'A': 'a', 'B': 'b'}),结果报错或列名完全没变。
- 必须显式指定
columns=(改列)或index=(改行索引) - 字典键必须严格匹配原始列名(区分大小写、空格、不可见字符)
- 如果列名含空格或特殊符号,检查是否真正在
df.columns里存在,而不是肉眼看着像
想批量加前缀/后缀,别手写字典
硬编码字典适合改几个固定列;但几十列要统一加 feature_ 或转小写,用字典就反人类了。直接上 add_prefix() 和 add_suffix() 更安全、更快。
性能影响:比 rename(columns=dict) 快 2–5 倍(尤其列数 > 100),因为不涉及 key 查找和映射构造。
-
df.add_prefix('raw_')→ 所有列名前加raw_ -
df.add_suffix('_normalized')→ 所有列名后加_normalized - 这两个方法返回新 DataFrame,原地修改需加
inplace=True,但不推荐——链式操作会断掉
用函数动态重命名时,注意返回值类型
传函数给 columns= 是最灵活的方式,比如全转小写、删空格、正则替换。但函数必须返回字符串,不能返回 None 或其他类型,否则整列名变 None,后续操作全崩。
使用场景:读取 Excel 时列名带换行符、前后空格、中文顿号,或需要按业务规则标准化命名。
- 正确写法:
df.rename(columns=lambda x: x.strip().replace(' ', '_').lower()) - 错误写法:
lambda x: x.strip().replace(' ', '_').lower().replace('(', '').replace(')', '')—— 如果原始列名不含括号,没问题;但若含(却没对应),也没问题;真正危险的是函数里写了print()或没 return - 建议先用
list(df.columns)看一眼原始列名,再试函数,别直接跑在大表上
rename 后索引没变?那是你没动对地方
rename() 默认只改列名。如果误以为它能顺带改 index 名称(即 DataFrame 的 index.name),就会发现名字还是老样子——因为那是另一个属性。
容易踩的坑:用 df.rename(columns={'A': 'X'}, index={'row1': 'R1'}) 想改行标签,结果报 KeyError。因为 index= 参数只接受 dict(且 key 必须真实存在于当前 index 中),不是改 index 的 name。
- 改列名:
columns= - 改行标签(值):
index=(需确保 key 存在) - 改 index 名称(即
df.index.name):df.index.name = 'new_index_name'或df.rename_axis('new_index_name') - 改 columns 名称(即
df.columns.name):df.columns.name = 'vars'
这些名称字段本身不参与计算,但导出到 Excel 或做多级索引时,漏掉它们会让下游使用者一头雾水。










