Pandas: ¿eliminar un nivel de un índice de columna de varios niveles?
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
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]
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.
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í.