2013-11-20 16 views
6

Ho un dataframe serie temporali e vorrei reindicarlo tramite Trials and Measurements.Reindex sottolivello di panda dataframe multiindex

semplificato, ho questo:

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

cui voglio diventare questo:

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

Come posso fare questo meglio?

risposta

7

Proprio ieri, l'illustre Andy Hayden ha aggiunto questa funzione alla versione 0.13 di panda, che verrà rilasciata da un giorno all'altro. Vedere here per l'esempio di utilizzo che ha aggiunto ai documenti.

Se è possibile installare la versione di sviluppo dei panda dal sorgente, è possibile utilizzarla ora.

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

Il seguente codice è equivalente, se meno conciso, e funzionerà su qualsiasi versione recente di panda.

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

Infine, df.set_index(['Trial', 'Measurements'], inplace=True) per ottenere il risultato desiderato.

+4

haha! "illustrious" +1;) (Nota: cumcount funziona anche con i duplicati nell'indice, ma "equivalenti" non ... Ero un po 'sfacciato nei documenti e dicevo "* essenzialmente * equivalente": p) –

+0

e se Il mio indice non è chiamato ('misure') - ma piuttosto non ha alcun nome? – TheChymera

+1

I livelli dell'indice possono essere specificati usando la parola chiave '' level'', come '' groupby (level = 1) ''. –

Problemi correlati