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