single multiindex multi index python pandas

python - multiindex - seleccionando pandas multi-índice



pandas multiindex to single index (3)

Es una vieja pregunta, así que como un complemento a las respuestas existentes, también puede usar la query que es más legible en mi opinión y fácil de usar:

import pandas as pd df = pd.DataFrame({''A'': [1, 2, 3, 4], ''B'': [10, 20, 50, 80], ''C'': [6, 7, 8, 9]}) df = df.set_index([''A'', ''B'']) C A B 1 10 6 2 20 7 3 50 8 4 80 9

Por lo que tenías en mente, ahora puedes simplemente hacer:

df.query(''A == 1'') C A B 1 10 6

También puede tener consultas más complejas usando and

df.query(''A >= 1 and B >= 50'') C A B 3 50 8 4 80 9

y or

df.query(''A == 1 or B >= 50'') C A B 1 10 6 3 50 8 4 80 9

También puede consultar en diferentes niveles de índice, por ejemplo

df.query(''A == 1 or C >= 8'')

regresará

C A B 1 10 6 3 50 8 4 80 9

Tengo un marco de datos de múltiples índices con las columnas ''A'' y ''B''.

¿Existe alguna forma de seleccionar filas filtrando en una columna del multi-índice sin restablecer el índice a índice de columna individual?

Por ejemplo.

# has multi-index (A,B) df #can i do this? I know this doesnt work because index is multi-index so I need to specify a tuple df.ix[df.A ==1]


Puede usar DataFrame.xs() :

In [36]: df = DataFrame(np.random.randn(10, 4)) In [37]: df.columns = [np.random.choice([''a'', ''b''], size=4).tolist(), np.random.choice([''c'', ''d''], size=4)] In [38]: df.columns.names = [''A'', ''B''] In [39]: df Out[39]: A b a B d d d d 0 -1.406 0.548 -0.635 0.576 1 -0.212 -0.583 1.012 -1.377 2 0.951 -0.349 -0.477 -1.230 3 0.451 -0.168 0.949 0.545 4 -0.362 -0.855 1.676 -2.881 5 1.283 1.027 0.085 -1.282 6 0.583 -1.406 0.327 -0.146 7 -0.518 -0.480 0.139 0.851 8 -0.030 -0.630 -1.534 0.534 9 0.246 -1.558 -1.885 -1.543 In [40]: df.xs(''a'', level=''A'', axis=1) Out[40]: B d d 0 -0.635 0.576 1 1.012 -1.377 2 -0.477 -1.230 3 0.949 0.545 4 1.676 -2.881 5 0.085 -1.282 6 0.327 -0.146 7 0.139 0.851 8 -1.534 0.534 9 -1.885 -1.543

Si desea mantener el nivel A (el argumento de la palabra clave drop_level solo está disponible a partir de v0.13.0):

In [42]: df.xs(''a'', level=''A'', axis=1, drop_level=False) Out[42]: A a B d d 0 -0.635 0.576 1 1.012 -1.377 2 -0.477 -1.230 3 0.949 0.545 4 1.676 -2.881 5 0.085 -1.282 6 0.327 -0.146 7 0.139 0.851 8 -1.534 0.534 9 -1.885 -1.543


Una forma es usar el método del índice get_level_values :

In [11]: df Out[11]: 0 A B 1 4 1 2 5 2 3 6 3 In [12]: df.iloc[df.index.get_level_values(''A'') == 1] Out[12]: 0 A B 1 4 1

En 0.13 podrás usar xs con argumento drop_level :

df.xs(1, level=''A'', drop_level=False) # axis=1 if columns

Nota: si se tratara de una columna MultiIndex en lugar de un índice, podría usar la misma técnica:

In [21]: df1 = df.T In [22]: df1.iloc[:, df1.columns.get_level_values(''A'') == 1] Out[22]: A 1 B 4 0 1