dataframe pandas seleccionar columnas en multiindex

Tengo el siguiente pd.DataFrame:

Name 0 1 ... Col ABAB ... 0 0.409511 -0.537108 -0.355529 0.212134 ... 1 -0.332276 -1.087013 0.083684 0.529002 ... 2 1.138159 -0.327212 0.570834 2.337718 ... 

Tiene columnas MultiIndex con names=['Name', 'Col'] y niveles jerárquicos. La etiqueta de Name va de 0 a n, y para cada etiqueta, hay dos columnas A y B

Me gustaría subseleccionar todas las columnas A (o B ) de este DataFrame.

Existe un método get_level_values que puede usar junto con la indexación booleana para obtener el resultado deseado.

 In [13]: df = pd.DataFrame(np.random.random((4,4))) df.columns = pd.MultiIndex.from_product([[1,2],['A','B']]) print df 1 2 ABAB 0 0.543980 0.628078 0.756941 0.698824 1 0.633005 0.089604 0.198510 0.783556 2 0.662391 0.541182 0.544060 0.059381 3 0.841242 0.634603 0.815334 0.848120 In [14]: print df.iloc[:, df.columns.get_level_values(1)=='A'] 1 2 AA 0 0.543980 0.756941 1 0.633005 0.198510 2 0.662391 0.544060 3 0.841242 0.815334 

Método 1:

 df.xs('A', level='Col', axis=1) 

Para más información, consulte http://pandas.pydata.org/pandas-docs/stable/advanced.html#cross-section

Método 2:

 df.loc[:, (slice(None), 'A')] 

Advertencia: este método requiere que las tags estén ordenadas. Para más información, consulte http://pandas.pydata.org/pandas-docs/stable/advanced.html#the-need-for-sortedness-with-multiindex

EDITAR * La mejor manera ahora es usar indexSlice para selecciones de múltiples índices

 idx = pd.IndexSlice A = df.loc[:,idx[:,'A']] B = df.loc[:,idx[:,'B']] 

También puede intercambiar los índices de columna y luego seleccionar, por ejemplo …

 df = df.swaplevel(0,1,axis =1) A = df['A'] B = df['B']