2013-11-20 3 views
6

Ich habe eine Zeitreihe Datenrahmen und ich möchte es durch Trials und Messungen neu indizieren.Reindex Sublevel von Pandas Dataframe Multiindex

Simplified, ich habe dies:

   value 
Trial   
    1  0  13 
      1   3 
      2   4 
    2  3  NaN 
      4  12 
    3  5  34 

Was ich in diese machen wollen:

    value 
Trial  
    1  0  13 
      1   3 
      2   4 
    2  0  NaN 
      1  12 
    3  0  34 

Wie kann ich das am besten tun?

Antwort

7

Erst gestern hat der berühmte Andy Hayden diese Funktion der Version 0.13 der Pandas hinzugefügt, die jetzt jeden Tag veröffentlicht wird. Siehe here für ein Anwendungsbeispiel, das er zu den Dokumenten hinzugefügt hat.

Wenn Sie die Entwicklungsversion von Pandas aus der Quelle installieren möchten, können Sie sie jetzt verwenden.

df['Measurements'] = df.reset_index().groupby('Trial').cumcount() 

Der folgende Code ist äquivalent, wenn weniger markig, und wird auf jeder neuen Version von Pandas funktionieren.

grouped = df.reset_index().groupby('Trial') 
df['Measurements'] = grouped.apply(lambda x: Series(np.arange(len(x)), x.index)) 

Schließlich df.set_index(['Trial', 'Measurements'], inplace=True), um Ihr gewünschtes Ergebnis zu erhalten.

+4

haha! "illustre" +1;) (Anmerkung: cumcount funktioniert auch mit Dupes im Index, aber "Äquivalent" nicht ... Ich war ein bisschen frech in der Dokumentation und sagte "* im Wesentlichen * gleichwertig": p) –

+0

was wäre wenn Mein Index heißt nicht "Messungen" - hat aber keinen Namen? – TheChymera

+1

Unbenannte Indexstufen können mit dem Schlüsselwort '' level'' angegeben werden, wie '' groupby (level = 1) ''. –