una seleccionar nueva insertar filtrar fila datos crear columnas columna python pandas

nueva - seleccionar columnas pandas python



Pandas: baje un nivel de un Ă­ndice de columna de niveles mĂșltiples? (5)

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 ---+-- b | c --+---+-- 0 | 1 | 2 1 | 3 | 4

¿Cómo puedo eliminar el nivel "a" de ese índice, así que termino con:

b | c --+---+-- 0 | 1 | 2 1 | 3 | 4


He luchado con este problema ya que 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 índices. Hacer como esto ayudará

df.columns.name = None df.reset_index() #make index become label


Otra forma de hacerlo es reasignar df basándose en una sección transversal de df , utilizando el método .xs .

>>> df a b c 0 1 2 1 3 4 >>> df = df.xs(''a'', axis=1, drop_level=True) # ''a'' : key on which to get cross section # axis=1 : get cross section of column # drop_level=True : returns cross section without the multilevel index >>> df b c 0 1 2 1 3 4


Otra forma de soltar el índice es usar una lista de 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

Dejar caer el nivel superior dejaría dos columnas con el índice ''y''. Eso 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 groupby y me tomó un tiempo encontrar esta otra pregunta que lo resolvió. Adapté esa solución al caso específico aquí.


Puede 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]


También puedes lograr eso cambiando el nombre de las columnas:

df.columns = [''a'', ''b'']

Esto implica un paso manual, pero podría ser una opción, especialmente si finalmente cambiaría el nombre de su marco de datos.