tablas renombrar para nombre leer funciones filtrar datos data crear columns columnas columna cambiar python pandas rename dataframe multi-index

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)