Tengo un df que se parece a esto:

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 cambiar el nombre de columna ‘1’ y ‘2’ como ‘Uno’ y ‘Dos’?

Pensé df.rename() hubiera ayudado, pero no es así. No tienen idea de cómo hacer esto?

OriginalEl autor Boosted_d16 | 2015-03-31

6 Comentarios

  1. 20

    Que es de hecho algo que falta en rename (idealmente debería dejar de especificar el nivel).

    Otra forma es mediante el ajuste de los niveles de las columnas de índice, pero entonces usted necesita saber todos los valores de 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')
    Genial muchas gracias.

    OriginalEl autor joris

  2. 4

    Uso 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
    Gracias por el esfuerzo!

    OriginalEl autor TheBlackCat

  3. 2

    df.rename_axis({'1':'one', '2':'two'}, axis='columns', inplace=True)

    OriginalEl autor amn34

  4. 0

    Esta es una buena pregunta. La combinación de la respuesta anterior, se 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

    Que trabajó para mí.

    Idealmente, una funcionalidad como este debe ser integrado en el «oficial» de «cambiar el nombre de» función en el futuro, así que usted no necesita escribir un hack como este.

    OriginalEl autor Ying Zhang

  5. 0

    Como de los pandas 0.22.0 (y probablemente mucho antes), puede especificar el nivel:

    df = df.rename(columns={'1': one, '2': two}, level=0)

    o, alternativamente, (nueva notación desde pandas 0.21.0):

    df = df.rename({'1': one, '2': two}, axis='columns', level=0)

    Pero, en realidad, funciona incluso cuando la omisión de la nivel:

    df = df.rename(columns={'1': one, '2': two})

    En ese caso, todos los niveles de columna son revisados por las ocurrencias que se desea cambiar.

    OriginalEl autor kadee

Dejar respuesta

Please enter your comment!
Please enter your name here