2012-04-16 9 views
15

tengo el siguiente pandas trama de datos con un MultiIndex (Z, A):Seleccionar los datos a un nivel particular de una MultiIndex

   H1  H2 
    Z A 
0 100 200 0.3112 -0.4197 
1 100 201 0.2967 0.4893  
2 100 202 0.3084 -0.4873 
3 100 203 0.3069 NaN   
4 101 203 -0.4956 NaN  

Pregunta: ¿Cómo puedo seleccionar todos los elementos con A = 203? Intenté df[:,'A'] pero no funciona. Entonces me encontré this en la documentación en línea, así que trataron:
df.xs(203,level='A')
pero me sale:
"TypeError: xs() got an unexpected keyword argument 'level'"
Además no veo este parámetro en el doc instalado (df.xs?):
"Parámetros ---- ------ key: object Alguna etiqueta contenida en el índice, o parcialmente en un eje MultiIndex: int, default 0 Axis para recuperar la sección transversal en copy: boolean, default True Ya sea para hacer una copia de los datos "
Nota: Tengo la versión de desarrollo.

Editar: Encontré this thread. Recomiendan algo como:

df.select(lambda x: x[1]==200, axis=0) 

todavía me gustaría saber lo que sucedió con df.xs con el parámetro de nivel o lo que es la forma recomendada en la versión actual.

+0

Qué versión está utilizando? Aparentemente 'level' se agregó en [versión' 0.7.0'] (http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#v-0-7-0-february-9-2012) . – Avaris

+0

Bueno, aparentemente ese es el problema, estoy en 0.6.1, instalé desde git pero de alguna manera todavía estoy en 0.6.1, gracias, ¿debería cerrar la pregunta, si es así, cómo? – elyase

+0

Puede escribir una respuesta con el motivo del problema y la solución alternativa y aceptarlo. – Avaris

Respuesta

7

El problema radica en mi suposición (incorrecta) que estaba en la versión dev mientras que en realidad tuve 1.6.1, se puede comprobar la versión actual instalada con:

import pandas 
print pandas.__version__ 

en la versión actual df.xs() con el parámetro de nivel funciona bien.

4
No

un directa respuesta a la pregunta, pero si desea seleccionar más de un valor se puede utilizar el "slice()" notación:

import numpy 
from pandas import MultiIndex, Series 

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
       ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] 
tuples = list(zip(*arrays)) 
index = MultiIndex.from_tuples(tuples, names=['first', 'second']) 
s = Series(numpy.random.randn(8), index=index) 

In [10]: s 
Out[10]: 
first second 
bar one  0.181621 
     two  1.016225 
baz one  0.716589 
     two  -0.353731 
foo one  -0.326301 
     two  1.009143 
qux one  0.098225 
     two  -1.087523 
dtype: float64 

In [11]: s.loc[slice(None)] 
Out[11]: 
first second 
bar one  0.181621 
     two  1.016225 
baz one  0.716589 
     two  -0.353731 
foo one  -0.326301 
     two  1.009143 
qux one  0.098225 
     two  -1.087523 
dtype: float64 

In [12]: s.loc[slice(None), "one"] 
Out[12]: 
first 
bar  0.181621 
baz  0.716589 
foo  -0.326301 
qux  0.098225 
dtype: float64 

In [13]: s.loc["bar", slice(None)] 
Out[13]: 
first second 
bar one  0.181621 
     two  1.016225 
dtype: float64 
Cuestiones relacionadas