Pandas: ¿eliminar un nivel de un índice de columna de varios niveles?

Resuelto David Wolever asked hace 10 años • 0 respuestas

Si tengo un índice de columna de varios niveles:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
    a
   ---+--
    segundo | C
--+---+--
0 | 1 | 2
1 | 3 | 4

¿Cómo puedo eliminar el nivel "a" de ese índice para terminar con:

    segundo | C
--+---+--
0 | 1 | 2
1 | 3 | 4
David Wolever avatar Mar 07 '14 01:03 David Wolever
Aceptado

Puedes usar MultiIndex.droplevel:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> df = pd.DataFrame([[1,2], [3,4]], columns=cols)
>>> df
   a   
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]
>>> df.columns = df.columns.droplevel()
>>> df
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]
DSM avatar Mar 06 '2014 19:03 DSM

A partir de Pandas 0.24.0 , ahora podemos usar DataFrame.droplevel() :

cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
df = pd.DataFrame([[1,2], [3,4]], columns=cols)

df.droplevel(0, axis=1) 

#   b  c
#0  1  2
#1  3  4

Esto es muy útil si desea mantener la cadena de métodos de DataFrame en funcionamiento.

jxc avatar May 10 '2019 15:05 jxc

Otra forma de eliminar el índice es utilizar una lista por comprensión:

df.columns = [col[1] for col in df.columns]

   b  c
0  1  2
1  3  4

Esta estrategia también es útil si desea combinar los nombres de ambos niveles, como en el siguiente ejemplo donde el nivel inferior contiene dos 'y':

cols = pd.MultiIndex.from_tuples([("A", "x"), ("A", "y"), ("B", "y")])
df = pd.DataFrame([[1,2, 8 ], [3,4, 9]], columns=cols)

   A     B
   x  y  y
0  1  2  8
1  3  4  9

Eliminar el nivel superior dejaría dos columnas con el índice 'y'. Esto se puede evitar uniendo los nombres con la lista de comprensión.

df.columns = ['_'.join(col) for col in df.columns]

    A_x A_y B_y
0   1   2   8
1   3   4   9

Ese es un problema que tuve después de hacer un grupo y me tomó un tiempo encontrar esta otra pregunta que lo resolviera. Adapté esa solución al caso específico aquí.

Mint avatar Jun 28 '2017 21:06 Mint