Convierta Pandas Multi-Index en columna

155

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 

Lo 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 

¿Cómo puedo hacer esto mejor?

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

TheChymera
fuente
2
Duplicado: stackoverflow.com/questions/18624039/… Desea la primera sugerencia. .reset_index()
TomAugspurger
1
muchas gracias, realmente navegado alrededor por esto mucho, pero "marca multiindex a la columna" y frases semejantes siempre me consiguió hilos que querían hacer pivotar sus tramas de datos ...
TheChymera
3
Siempre es más fácil encontrar una respuesta cuando ya la sabes :)
TomAugspurger

Respuestas:

192

El reset_index () es un método pandas trama de datos que va a transferir valores de índice en la trama de datos como columnas. La configuración predeterminada para el parámetro es drop = False (que mantendrá los valores del índice como columnas).

Todo lo que tiene que hacer es agregar .reset_index(inplace=True)después del nombre del DataFrame:

df.reset_index(inplace=True)  
CraigSF
fuente
3
Para mi caso donde tenía 3 niveles de índice, el reinicio in situ no funcionó. La alternativa es asignar un marco de datos recientemente restablecido a uno nuevo: df2 = df.reset_index ()
Gorkem
8
Para restablecer solo un nivel en particular, usedf.reset_index(level=[...])
cs95
20

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

                         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, debe cambiar el nombre del índice múltiple con df.index = df.index.set_names(['Trial', 'measurement'])para 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á como un encanto.

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 se nombraron tanto el año como el mes live_date.

Karl Anka
fuente
1
¿Cómo hacer que sus valores de prueba se repitan? Tuve el mismo problema y funciona, excepto que mis valores no se repiten.
Rico
4

Como @ cs95 mencionó en un comentario, para soltar solo un nivel, use:

df.reset_index(level=[...])

Esto evita tener que redefinir el índice deseado después de reiniciar.

sameagol
fuente