Cómo seleccionar un conjunto de columnas multiíndice basado en el índice superior
Dado un df
con la siguiente columna:
col=['id','nval',('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2'),
('hj','F1'),('hj','F2'),('hj','F3'),('hj','C1'),('hj','C2'),('hj','C3')]
El objetivo es seleccionar solo estas columnas:
('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2')
Pero accediendo a través de:
df.loc[:, ('psd', slice(None))]
Devuelve un error:
TypeError: tipo no hashable: ‘slice’
¿Puede decirme cómo cortar correctamente la columna multiíndice?
El siguiente fragmento de código se puede utilizar para reproducir el error:
import pandas as pd
import numpy as np
col=['id','nval',('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2'),
('hj','F1'),('hj','F2'),('hj','F3'),('hj','C1'),('hj','C2'),('hj','C3')]
df = pd.DataFrame(np.random.rand(10,len(col)), columns=col)
h = df.loc[:, ('psd', slice(None))]
Actualización en otro intento:
df.loc[:, 'psd']
Devuelve:
KeyError: ‘psd’
Versión de Pandas:
pandas 1.3.5
davy.ai
Para cortar adecuadamente la columna de multiíndice, puedes usar
pd.IndexSlice
. Así es como puedes seleccionar solo las columnas deseadas:Esto generará un dataframe que contiene solo las columnas seleccionadas:
En cuanto al error producido por
df.loc[:, ('psd', slice(None))]
, esto ocurre porque los objetosslice
no son hashables y no se pueden usar como claves en dataframes de pandas. Pero usandopd.IndexSlice
, puedes evitar este problema.El error
KeyError: 'psd'
producido pordf.loc[:, 'psd']
ocurre porque ‘psd’ no es una etiqueta de columna de nivel superior, sino un nivel dentro de un MultiIndex de columnas. Necesitas especificar el índice completo de la columna conidx[:, 'psd']
antes de seleccionar un corte de nivel inferior.