您的位置:首页 >如何正确重命名Pandas DataFrame的列名
发布于2026-05-02 阅读(0)
扫一扫,手机访问

当尝试通过直接赋值 df.columns = [...] 修改列名时遇到“can't set attribute 'columns'”错误,通常是因为DataFrame的columns属性为只读(如使用某些底层视图或特定构造方式),此时应改用.rename()方法并设置inplace=True,或确保columns可写(如复制原始DataFrame)。
直接给DataFrame的df.columns属性赋一个新列表来修改列名,这招儿在大多数时候确实管用。但如果你遇到了“AttributeError: can‘t set attribute ’columns‘”这个拦路虎,那事情就没那么简单了。这通常意味着你手头的这个DataFrame,其columns属性被设置成了只读状态。这种情况常发生在DataFrame是一个不可变的视图(view),或者它来源于某些特殊的数据源,比如从数据库查询、Dask DataFrame转换而来,亦或是在某些操作(如调用了.values)之后不小心触发了保护机制。
当直接赋值碰壁时,最稳妥、兼容性最强的办法就是调用.rename()方法。这不仅是Pandas官方推荐的方式,其语义也足够清晰,能绕过底层的只读限制。
import pandas as pd
# 示例数据(100列可同理处理)
data = pd.DataFrame({f"col_{i}": range(5) for i in range(100)})
# 构建新列名列表(例如按规则生成)
new_columns = [f"ide_ads", "ide_any", "ide_sfdsdf"] + [f"col_{i}_renamed" for i in range(3, 100)]
# 方式1:尝试直接赋值(如果报错,则说明columns不可写)
# data.columns = new_columns # ❌ 若此处报错,则跳至方式2
# 方式2:使用 rename() —— 兼容性最强,始终有效
column_mapping = {old: new for old, new in zip(data.columns, new_columns)}
data.rename(columns=column_mapping, inplace=True)
inplace=True会直接修改原DataFrame。如果想保留原始数据,可以省略这个参数,并将结果赋值给一个新变量,例如 data_renamed = data.rename(columns=...)。rename,新提供的列名列表长度必须与原列数严格一致,否则会引发ValueError。rename()方法对重复列名依然有效,但直接赋值后产生的重复列名,可能会让后续的.groupby()等操作“罢工”。pd.read_sql()、dask.dataframe.to_pandas()或浅拷贝(.copy(deep=False)),建议先执行data = data.copy()创建一个独立的副本,再尝试修改列名,这能有效解除可能的只读约束。手动编写100个新列名?大可不必。利用Python的列表推导式或Pandas的字符串方法,可以轻松实现批量、规则化的重命名。
# 方法一:使用列表推导式(灵活通用)
# 例如,统一转换为小写并用下划线替换空格
data.columns = [col.strip().lower().replace(' ', '_') for col in data.columns]
# 方法二:使用Pandas的str方法(更简洁,适合列名为字符串时)
data.columns = data.columns.str.strip().str.lower().str.replace(r'\s+', '_', regex=True)
总而言之,当遭遇“can‘t set attribute ’columns‘”错误时,别再跟直接赋值较劲了。优先转向.rename(columns=..., inplace=True)这个方法。它不依赖于底层属性是否可写,意图明确,是处理列名修改任务的“万金油”。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9