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
相关产品推荐
相关产品推荐

