2013-11-22 18 views
9

Sto iniziando con un dizionario come questo:Conversione tuple a più indici in un Pandas dataframe

dict = {(100000550L, u'ActivityA'): {'bar__sum': 14.0, 'foo__sum': 12.0}, 
     (100001799L, u'ActivityB'): {'bar__sum': 7.0, 'foo__sum': 3.0}} 

che, una volta convertito in un dataframe, pone come colonna intestazioni le tuple di (id, ActivityType):

df = DataFrame(dict).transpose() 

         bar__sum foo__sum 
(100000550, ActivityA)  14  12 
(100001799, ActivityB)   7   3 

Come posso convertire le tuple nell'indice in un MultiIndex? Cioè, in modo che il risultato finale assomiglia a questo:

     bar__sum foo__sum 
id  act_type 
100000550 ActivityA  14  12 
100001799 ActivityB   7   3 

Qual è il modo migliore per farlo? C'è qualche opzione sulla creazione di DataFrame che mi manca? O dovrebbe accadere tramite una lista di comprensione, che mi sembra inefficiente.

risposta

12

Se si vuole indice di convertire della vostra dataframe:

>>> df.index = pd.MultiIndex.from_tuples(df.index) 
>>> df 
        bar__sum foo__sum 
100000550 ActivityA  14  12 
100001799 ActivityB   7   3 

>>> df.index.names = ['id', 'act_type'] 
>>> df 
        bar__sum foo__sum 
id  act_type      
100000550 ActivityA  14  12 
100001799 ActivityB   7   3 

È inoltre possibile creare dataframe direttamente dal dizionario (d è il vostro dict, non chiamare la variabile dict dal momento che sarà ombra dizionario Python standard):

>>> pd.DataFrame(d.values(), index=pd.MultiIndex.from_tuples(d.keys(), names=['id', 'act_type'])) 
        bar__sum foo__sum 
id  act_type      
100001799 ActivityB   7   3 
100000550 ActivityA  14  12 

noti che values() e keys() sono 012., quindi non preoccuparti.

+1

Bel trucco passando solo 'd.values ​​()' come argomento! Stavo cercando di capire qualcosa per ottenere l'accesso all'indice post-ordinato dopo aver passato 'd', ma in questo modo non ne hai affatto bisogno. – DSM

Problemi correlati