2014-07-17 14 views
6

Ho un DataFrame MultiIndexed df1 e vorrei eseguire il loop su di esso in modo tale che in ogni istanza del ciclo abbia un DataFrame con un indice normale non gerarchico che è il sottoinsieme di df1 corrispondente alle voci dell'indice esterno. Vale a dire, se ho:In loop su un MultiIndex nei panda

FirstTable

voglio ottenere

SecondTable

e successivamente C1, C2, ecc anche io non so che cosa i nomi di queste saranno effettivamente (C1, ecc., Rimanendo solo segnaposto qui), quindi vorrei semplicemente ripetere il numero dei valori di C i che ho.

Sono inciampato in giro con iterrows e vari loop e non ho ottenuto risultati tangibili e non so davvero come procedere. Mi sento come se esistesse una soluzione semplice, ma non trovavo nulla di utile nella documentazione, probabilmente a causa della mia mancanza di comprensione.

risposta

7

Utilizzando un esempio modificato da here

In [30]: def mklbl(prefix,n): 
     return ["%s%s" % (prefix,i) for i in range(n)] 
    ....: 

In [31]: columns = MultiIndex.from_tuples([('a','foo'),('a','bar'), 
            ('b','foo'),('b','bah')], 
            names=['lvl0', 'lvl1']) 

In [33]: index = MultiIndex.from_product([mklbl('A',4),mklbl('B',2)]) 

In [34]: df = DataFrame(np.arange(len(index)*len(columns)).reshape((len(index),len(columns))), 
       index=index, 
       columns=columns).sortlevel().sortlevel(axis=1) 

In [35]: df 
Out[35]: 
lvl0  a   b  
lvl1 bar foo bah foo 
A0 B0 1 0 3 2 
    B1 5 4 7 6 
A1 B0 9 8 11 10 
    B1 13 12 15 14 
A2 B0 17 16 19 18 
    B1 21 20 23 22 
A3 B0 25 24 27 26 
    B1 29 28 31 30 

In [36]: df.loc['A0'] 
Out[36]: 
lvl0 a   b  
lvl1 bar foo bah foo 
B0  1 0 3 2 
B1  5 4 7 6 

In [37]: df.loc['A1'] 
Out[37]: 
lvl0 a   b  
lvl1 bar foo bah foo 
B0  9 8 11 10 
B1  13 12 15 14 

No looping è necessaria.

È anche possibile selezionarli per restituire un frame (con MI originale) ad es. df.loc[['A1']]

Se si desidera ottenere i valori dell'indice:

In [38]: df.index.get_level_values(0).unique() 
Out[38]: array(['A0', 'A1', 'A2', 'A3'], dtype=object) 
+0

Grazie, che funziona se so che cosa l'etichetta è, ma cosa mi fare se non lo faccio? vale a dire. Non conosco i nomi dell'indice (nel mio problema, essi (A nell'esempio) sono minuti in cui si è verificato almeno un evento e l'indice secondario (B nell'esempio) contiene i secondi in cui si sono verificati eventi specifici). non so quando si sono verificati gli eventi Inoltre, il tuo esempio non esegue iterazioni su tutti gli elementi dell'indice e voglio scorrere ogni minuto. –

+0

aggiornato per mostrare come ottenere i valori di livello. Il ciclo è semplice se si desidera realmente eseguire il ciclo. – Jeff

+0

@jeff puoi dare un'occhiata a questo [caso d'uso] (http://stackoverflow.com/questions/38352742/pandas-design-considerations-for-multiindexed-dataframes)? – toasteez

0

Stai cercando di fare qualcosa di simile?

for i in set(df.index): 
    print df.loc[i].reset_index() 
  1. set(df.index) restituisce un insieme di tuple uniche del vostro multi-index (indice gerarchico).
  2. df.loc[i].reset_index() ... df.loc[i] ovviamente restituisce un sottoinsieme del vostro dataframe originale, e la parte .reset_index() convertirà l'indice alle colonne
Problemi correlati