首页 > 解决方案 > 如何更改多列中的重复名称?

问题描述

我有这个df:

CODIGO NOMBRE           Enero  Enero  Febrero  Febrero  Marzo  Marzo  ....                                        
000130 RICA PLAYA       31.3   21.0     31.7     22.0   31.8   22.0
000132 PUERTO PIZARRO   32.5   19.0     32.2     18.0   32.5   17.0
000134 PAPAYAL          31.7   25.0     31.5     27.0   31.8   26.0
000135 EL SALTO         31.1   27.0     31.5     26.0   31.5   26.0
000136 CAÑAVERAL        32.4   17.0     32.0     16.0   32.3   16.0
                     ...    ...      ...      ...    ...    ...
158317 SUSAPAYA         17.3   20.0     16.8     20.0   17.2   19.0
158321 PALCA            17.9   16.0     17.8     17.0   18.4   16.0
158323 TALABAYA         17.1   12.0     16.7     12.0   17.2   12.0
158326 CAPAZO           13.7   19.0     13.6     19.0   13.5   17.0
158328 PAUCARANI        13.1   15.0     12.9     15.0   13.4   14.0  ....

有 26 列。

我想将第二个 Enero 重命名为 N1,将第二个 Febrero 重命名为 N2,将第二个 Marzo 重命名为 N3,等等,如下所示:

CODIGO NOMBRE           Enero  N1      Febrero   N2     Marzo  N3   ....                                        
000130 RICA PLAYA       31.3   21.0     31.7     22.0   31.8   22.0
000132 PUERTO PIZARRO   32.5   19.0     32.2     18.0   32.5   17.0
000134 PAPAYAL          31.7   25.0     31.5     27.0   31.8   26.0
000135 EL SALTO         31.1   27.0     31.5     26.0   31.5   26.0
000136 CAÑAVERAL        32.4   17.0     32.0     16.0   32.3   16.0
                     ...    ...      ...      ...    ...    ...
158317 SUSAPAYA         17.3   20.0     16.8     20.0   17.2   19.0
158321 PALCA            17.9   16.0     17.8     17.0   18.4   16.0
158323 TALABAYA         17.1   12.0     16.7     12.0   17.2   12.0
158326 CAPAZO           13.7   19.0     13.6     19.0   13.5   17.0
158328 PAUCARANI        13.1   15.0     12.9     15.0   13.4   14.0  ....

所以我做了:

df.columns['CODIGO','NOMBRE','Enero','N1','Febrero','N2'...... etc etc]

有没有比写每个名字更有效或更快的方法?

标签: pythonpandas

解决方案


假设重复值的顺序正确,可以通过修改wherevalues来替换它们:columnsduplicated

m = df.columns.duplicated()
df.columns.values[m] = [f'N{i}' for i in range(1, 1 + m.sum())]

或使用arangeand Series

import numpy as np

df.columns.values[m] = 'N' + pd.Series(np.arange(1, 1 + m.sum()), dtype=str)

或与cumsum

df.columns.values[m] = 'N' + pd.Series(m.cumsum()[m], dtype=str)

import pandas as pd

df = pd.DataFrame(columns=['CODIGO', 'NOMBRE', 'Enero', 'Enero',
                           'Febrero', 'Febrero', 'Marzo', 'Marzo'])
print('Before', df)

m = df.columns.duplicated()
df.columns.values[m] = [f'N{i}' for i in range(1, 1 + m.sum())]

print('After', df)
Before Empty DataFrame
Columns: [CODIGO, NOMBRE, Enero, Enero, Febrero, Febrero, Marzo, Marzo]
Index: []

After Empty DataFrame
Columns: [CODIGO, NOMBRE, Enero, N1, Febrero, N2, Marzo, N3]
Index: []

推荐阅读