Convierta Pandas Multi-Index en una columna

Resuelto TheChymera asked hace 11 años • 8 respuestas

Tengo un marco de datos con 2 niveles de índice:

                         value
Trial    measurement
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

Que quiero convertir en esto:

Trial    measurement       value

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

¿Cuál es la mejor manera de hacer esto?

Necesito esto porque quiero agregar los datos como se indica aquí , pero no puedo seleccionar mis columnas de esa manera si están en uso como índices.

TheChymera avatar Nov 21 '13 07:11 TheChymera
Aceptado

reset_index () es un método de DataFrame de pandas que transferirá valores de índice al DataFrame como columnas. La configuración predeterminada para el parámetro es drop=False (que mantendrá los valores del índice como columnas).

Todo lo que tienes que hacer es llamar .reset_index()después del nombre del DataFrame:

df = df.reset_index()  
CraigSF avatar Sep 08 '2014 21:09 CraigSF

Esto realmente no se aplica a su caso, pero podría ser útil que otros (como yo hace 5 minutos) lo sepan. Si el multindex tiene el mismo nombre así:

                         value
Trial        Trial
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

df.reset_index(inplace=True)fallará, porque las columnas que se crean no pueden tener los mismos nombres.

Entonces necesitas cambiar el nombre del multindex para df.index = df.index.set_names(['Trial', 'measurement'])obtener:

                           value
Trial    measurement       

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

Y luego df.reset_index(inplace=True)funcionará a las mil maravillas.

Encontré este problema después de agrupar por año y mes en una columna de fecha y hora (no índice) llamada live_date, lo que significaba que tanto el año como el mes tenían el nombre live_date.

Karl Anka avatar Nov 17 '2017 17:11 Karl Anka

Puede haber situaciones en las que df.reset_index()no se pueda utilizar (por ejemplo, cuando también necesite el índice). En este caso, utilice index.get_level_values()para acceder a los valores del índice directamente:

df['Trial'] = df.index.get_level_values(0)
df['measurement'] = df.index.get_level_values(1)

Esto asignará valores de índice a columnas individuales y mantendrá el índice.

Consulte los documentos para obtener más información.

Alex avatar Oct 27 '2020 08:10 Alex