python - para - renombrar columna data frame pandas
pandas de pitón: cambiar el nombre de la etiqueta de una sola columna en el marco de datos de múltiples índices (5)
Tengo un df que se ve así:
df = pd.DataFrame(np.random.random((4,4)))
df.columns = pd.MultiIndex.from_product([[''1'',''2''],[''A'',''B'']])
print df
1 2
A B A B
0 0.030626 0.494912 0.364742 0.320088
1 0.178368 0.857469 0.628677 0.705226
2 0.886296 0.833130 0.495135 0.246427
3 0.391352 0.128498 0.162211 0.011254
¿Cómo puedo renombrar la columna ''1'' y ''2'' como ''Uno'' y ''Dos''?
Pensé que df.rename () habría ayudado, pero no es así. ¿No tienes idea de cómo hacer esto?
Eso es, de hecho, algo que falta en el rename
de rename
(idealmente debería permitirle especificar el nivel).
Otra forma es establecer los niveles del índice de columnas, pero luego debe conocer todos los valores para ese nivel:
In [41]: df.columns.levels[0]
Out[41]: Index([u''1'', u''2''], dtype=''object'')
In [43]: df.columns = df.columns.set_levels([''one'', ''two''], level=0)
In [44]: df
Out[44]:
one two
A B A B
0 0.899686 0.466577 0.867268 0.064329
1 0.162480 0.455039 0.736870 0.759595
2 0.620960 0.922119 0.060141 0.669997
3 0.871107 0.043799 0.080080 0.577421
In [45]: df.columns.levels[0]
Out[45]: Index([u''one'', u''two''], dtype=''object'')
Use set_levels
:
>>> df.columns.set_levels([''one'',''two''], 0, inplace=True)
>>> print(df)
one two
A B A B
0 0.731851 0.489611 0.636441 0.774818
1 0.996034 0.298914 0.377097 0.404644
2 0.217106 0.808459 0.588594 0.009408
3 0.851270 0.799914 0.328863 0.009914
df.columns.set_levels([''one'', ''two''], level=0, inplace=True)
Esta es una buena pregunta. Combinando la respuesta anterior, puede escribir una función:
def rename_col( df, columns, level = 0 ):
def rename_apply ( x, rename_dict ):
try:
return rename_dict[x]
except KeyError:
return x
if isinstance(df.columns, pd.core.index.MultiIndex):
df.columns = df.columns.set_levels([rename_apply(x, rename_dict = columns ) for x in df.columns.levels[level]], level= level)
else:
df.columns = [rename_apply(x, rename_dict = columns ) for x in df.columns ]
return df
Funcionó para mí
Idealmente, una funcionalidad como esta debe integrarse en la función "oficial" de "cambio de nombre" en el futuro, por lo que no es necesario escribir un truco como este.
df.rename_axis({''1'':''one'', ''2'':''two''}, axis=''columns'', inplace=True)