es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para cortar adecuadamente la columna de multiíndice, puedes usar pd.IndexSlice. Así es como puedes seleccionar solo las columnas deseadas:

    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)
    
    # Selecciona solo las columnas deseadas
    idx = pd.IndexSlice
    columns_to_select = idx[:, ['F1_b0', 'F2_b0', 'F3_b0', 'F1_b2', 'F2_b2']]
    result = df.loc[:, columns_to_select]
    
    print(result)
    

    Esto generará un dataframe que contiene solo las columnas seleccionadas:

              psd                                     ...                                    
          F1_b0    F2_b0    F3_b0    F1_b2    F2_b2  ...        hj                        
    0  0.264437  0.52229  0.263334  0.653614  0.48768  ...  0.408902  0.514071  0.578257
    1  0.151292  0.76819  0.858386  0.720493  0.92358  ...  0.928820  0.325416  0.788271
    2  0.956132  0.38967  0.872694  0.308465  0.34919  ...  0.899463  0.954005  0.418079
    3  0.020300  0.78195  0.359411  0.491828  0.76639  ...  0.581144  0.916638  0.616913
    4  0.950382  0.73216  0.068858  0.224475  0.29817  ...  0.019371  0.102585  0.491861
    5  0.764185  0.52525  0.029044  0.013229  0.36631  ...  0.410946  0.042955  0.376449
    6  0.624611  0.65077  0.714247  0.116429  0.03198  ...  0.345098  0.757865  0.364530
    7  0.415005  0.83725  0.010502  0.023243  0.74826  ...  0.268923  0.308408  0.602889
    8  0.229249  0.64845  0.398587  0.558452  0.49709  ...  0.909078  0.469319  0.640307
    9  0.806880  0.89773  0.256470  0.124746  0.32917  ...  0.683619  0.799417  0.878369
    
    [10 rows x 5 columns]
    

    En cuanto al error producido por df.loc[:, ('psd', slice(None))], esto ocurre porque los objetos slice no son hashables y no se pueden usar como claves en dataframes de pandas. Pero usando pd.IndexSlice, puedes evitar este problema.

    El error KeyError: 'psd' producido por df.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 con idx[:, 'psd'] antes de seleccionar un corte de nivel inferior.

Comments are closed.