2012-04-16 12 views
15

Ho la seguente Panda dataframe con un MultiIndex (Z, A):Selezionare i dati a un particolare livello da un 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  

Domanda: Come posso selezionare tutti gli elementi con A = 203? Ho provato df[:,'A'] ma non funziona. Poi ho trovato this nella documentazione in linea così ho provato:
df.xs(203,level='A')
ma ottengo:
"TypeError: xs() got an unexpected keyword argument 'level'"
Anche io non vedo questo parametro nel documento installato (df.xs?):
"Parametri ---- ------ key: object Alcune etichette contenute nell'indice, o parzialmente in un asse MultiIndex: int, default 0 Axis per recuperare la sezione trasversale su copy: boolean, default True Se creare una copia dei dati "
Nota: ho la versione di sviluppo.

Modifica: Ho trovato this thread. Essi raccomandano qualcosa come:

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

io ancora vorrei sapere cosa è successo con df.xs con il parametro del livello o che cosa è il metodo consigliato nella versione corrente.

+0

Quale versione stai usando? Apparentemente 'level' è stato aggiunto a [versione' 0.7.0'] (http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#v-0-7-0-february-9-2012) . – Avaris

+0

Bene apparentemente questo è il problema, sono su 0.6.1, ho installato da git ma in qualche modo sono ancora su 0.6.1, grazie, dovrei chiudere la domanda, se sì, come? – elyase

+0

È possibile scrivere una risposta con il motivo del problema e una soluzione alternativa e accettarla. – Avaris

risposta

7

Il problema sta nel mio presupposto (errato) che io ero nella versione dev, mentre in realtà ho avuto 1.6.1, si può verificare la versione installata corrente con:

import pandas 
print pandas.__version__ 

nella versione corrente df.xs() con il parametro di livello funziona ok.

4

Non un diretta risposta alla domanda, ma se si desidera selezionare più di un valore che si può usare il "slice()" la notazione:

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 
Problemi correlati