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)
una --- + - b | C - + --- + - 0 | 1 | 2 1 | 3 | 4 4
¿Cómo puedo eliminar el nivel "a" de ese índice, por lo que termino con:
b | C - + --- + - 0 | 1 | 2 1 | 3 | 4 4
droplevel
works puede funcionar en índices o columnas multinivel a través del parámetroaxis
.Respuestas:
Puedes usar
MultiIndex.droplevel
:fuente
>>> df.columns = df.columns.droplevel(0)
>>> df.index = df.index.droplevel(1)
df.columns.droplevel()
ya no está disponible.>>>df.columns = df.columns.droplevel(2) >>>df.columns = df.columns.droplevel(0)
Otra forma de eliminar el índice es usar una lista de comprensión:
Esta estrategia también es útil si desea combinar los nombres de ambos niveles, como en el ejemplo a continuación, donde el nivel inferior contiene dos 'y':
Dejar caer el nivel superior dejaría dos columnas con el índice 'y'. Eso puede evitarse uniendo los nombres con la comprensión de la lista.
Ese es un problema que tuve después de hacer un grupo y me tomó un tiempo encontrar esta otra pregunta que lo resolvió. Adapté esa solución al caso específico aquí.
fuente
[col[1] for col in df.columns]
Es más directamentedf.columns.get_level_values(1)
.[col[0] if col[1] == '' else col[1] for col in df.columns]
Otra forma de hacerlo es reasignar en
df
función de una sección transversal dedf
, utilizando el método .xs .fuente
b
), luego baje ese nivel y quede con el primer nivel (a
), lo siguiente funcionaría:df = df.xs('b', axis=1, level=1, drop_level=True)
A partir de Pandas 0.24.0 , ahora podemos usar DataFrame.droplevel () :
Esto es muy útil si desea mantener su cadena de método DataFrame funcionando.
fuente
También puede lograrlo cambiando el nombre de las columnas:
df.columns = ['a', 'b']
Esto implica un paso manual, pero podría ser una opción, especialmente si eventualmente cambiaría el nombre de su marco de datos.
fuente
df.columns.get_level_values(1)
.Un pequeño truco
sum
con level = 1 (funciona cuando level = 1 es único)Solución más común
get_level_values
fuente
He tenido problemas con este problema porque no sé por qué mi función droplevel () no funciona. Trabaja en varios y aprende que 'a' en tu tabla es el nombre de las columnas y 'b', 'c' son el índice. Hacer esto ayudará
fuente