You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按索引重命名重复列时同名列被同步修改的解决方法

问题说明

我有如下DataFrame数据:

+----+------+----+------+
| Id | Name | Id | Name |
+----+------+----+------+
|  1 | A    |  1 | C    |
|  2 | B    |  2 | B    |
+----+------+----+------+

虽然列名存在重复,但实际是前2列(旧数据)与后2列(新数据)做对比。我尝试通过索引给索引为2的列(倒数第二列)追加_New后缀,使用的代码如下:

df.rename(columns={df.columns[2]: df.columns[2] + '_New'}, inplace=True)

但运行后第一列和第三列的Id都被追加了_New,实际运行结果如下:

+--------+------+--------+------+
| Id_New | Name | Id_New | Name |
+--------+------+--------+------+
|      1 | A    |      1 | C    |
|  2 | B    |      2 | B    |
+--------+------+--------+------+

我的预期是仅给索引为2的列追加_New,预期结果如下:

+----+------+--------+------+
| Id | Name | Id_New | Name |
+----+------+--------+------+
|  1 | A    |      1 | C    |
|  2 | B    |      2 | B    |
+----+------+--------+------+

请问有什么方法可以实现该需求?

原因分析

df.rename()方法传入字典做列名映射时,是按照列名的字符串值做全局匹配修改,只要列名和字典key一致,就会被重命名,不会区分列的位置,所以两个名为Id的列会被同时修改。

解决方案

方法1:直接修改列名数组的指定位置

直接操作列名的底层numpy数组,只会修改指定索引位置的列名,不会触发全局匹配:

df.columns.values[2] += '_New'

方法2:整体替换列名列表

先把列名转成普通列表,修改指定位置后再重新赋值给DataFrame的columns属性,逻辑更直观,兼容性更好:

# 把列名转为列表
col_list = df.columns.tolist()
# 修改索引为2的列名
col_list[2] = f"{col_list[2]}_New"
# 重新赋值列名
df.columns = col_list

内容的提问来源于stack exchange,提问作者Sarath Subramanian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:54:06