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.