商城首页欢迎来到中国正版软件门户

您的位置:首页 >如何正确重命名Pandas DataFrame的列名

如何正确重命名Pandas DataFrame的列名

  发布于2026-05-02 阅读(0)

扫一扫,手机访问

如何正确重命名Pandas DataFrame的列名

如何正确重命名Pandas DataFrame的列名

当尝试通过直接赋值 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(columns=..., inplace=True)

当直接赋值碰壁时,最稳妥、兼容性最强的办法就是调用.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)

⚠️ 操作时需要注意的细节

  • 原地修改 vs 创建副本:设置inplace=True会直接修改原DataFrame。如果想保留原始数据,可以省略这个参数,并将结果赋值给一个新变量,例如 data_renamed = data.rename(columns=...)
  • 长度必须一致:无论是直接赋值还是rename,新提供的列名列表长度必须与原列数严格一致,否则会引发ValueError
  • 警惕重复列名rename()方法对重复列名依然有效,但直接赋值后产生的重复列名,可能会让后续的.groupby()等操作“罢工”。
  • 检查数据来源:如果DataFrame来自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)这个方法。它不依赖于底层属性是否可写,意图明确,是处理列名修改任务的“万金油”。

本文转载于:https://www.php.cn/faq/2333554.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注