2014-07-17 4 views
6

Ich habe ein MultiIndexed DataFrame df1, und möchte es so überschleifen, dass in jedem Fall der Schleife ein DataFrame mit einem regulären nicht-hierarchischen Index, der die Untermenge von ist df1 entspricht den äußeren Indexeinträgen. Das heißt, wenn ich habe:Schleifen über einen MultiIndex in Pandas

FirstTable

I

SecondTable

und anschließend C1, C2 erhalten wollen, etc. Ich weiß auch nicht, was die Namen dieser tatsächlich sein wird, (C1, usw., nur Platzhalter hier sein), so würde ich einfach die Anzahl der Werte, die ich habe, über die Anzahl der C i Schleife legen.

Ich bin mit iterrows und verschiedenen Schleifen herumgestolpert und habe keine greifbaren Ergebnisse und weiß nicht wirklich weiter. Ich glaube, es sollte eine einfache Lösung geben, aber ich konnte nichts finden, was in der Dokumentation hilfreich erschien, wahrscheinlich aufgrund meines eigenen Unverständnisses.

Antwort

7

ein modifiziertes Beispiel von 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 

Verwendung ist kein Looping notwendig.

Sie können diese auch auswählen, um einen Rahmen (mit dem ursprünglichen MI) z. df.loc[['A1']]

Wenn Sie die Werte im Index erhalten möchten:

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

Danke, das funktioniert konvertieren, wenn ich weiß, was das Etikett ist, aber was ich tu, wenn ich es nicht tue? dh. Ich kenne die Namen des Index nicht (in meinem Problem sind sie (A in Ihrem Beispiel) Minuten, in denen mindestens ein Ereignis aufgetreten ist, und der Subindex (B in Ihrem Beispiel) enthält die Sekunden, in denen bestimmte Ereignisse aufgetreten sind). Ich weiß nicht, wann die Ereignisse eingetreten sind. Außerdem durchläuft Ihr Beispiel nicht alle Elemente des Indexes und ich möchte jede Minute durchlaufen. –

+0

aktualisiert, um zu zeigen, wie die Pegelwerte erhalten werden. Looping ist einfach, wenn Sie wirklich loopen möchten. – Jeff

+0

@jeff können Sie sich diesen [Anwendungsfall] (http://stackoverflow.com/questions/38352742/pandas-design-considerations-for-multiindexed-dataframes) ansehen? – toasteez

0

Versuchen Sie, so etwas zu tun?

for i in set(df.index): 
    print df.loc[i].reset_index() 
  1. set(df.index) gibt eine Reihe von einzigartigen Tupeln Ihres Multi-Index (hierarchischer Index).
  2. df.loc[i].reset_index() ... df.loc[i] natürlich gibt eine Teilmenge des ursprünglichen Datenrahmen und der .reset_index() Teil wird der Index Spalten