2015-04-24 10 views
8

Sto provando a riordinare/swaplevel/pivot/qualcosa di colonne in un dataframe panda. Le colonne sono un MultiIndex, ma non riesco a trovare la salsa per fare quello che voglio.Come posso modificare l'ordine/raggruppamento/livello delle colonne MultiIndex dei panda?

La colonna più veloce nel mio multiIndex è il mese, ma mi piacerebbe che fosse la colonna più lenta.

Ho un notebook nbviewer se volete provare voi stessi: http://nbviewer.ipython.org/gist/flamingbear/4cfac24c80fe34a67474

Quello che ho:

+-------------------------------------------------------------------+ 
|+-----+------+------+-----+------+-----+-----+------+-----+-----+ | 
||  |weight    |extent   |rank    || 
|+-----+------+------+-----+------+-----+-----+------+-----+-----+ | 
||month|'1Jan'|'Feb' |'Mar'|'1Jan'|'Feb'|'Mar'|'1Jan'|'Feb'|'Mar'| | 
|+-----+------+------+-----+------+-----+-----+------+-----+-----+ | 
||year |  |  |  |  |  |  |  |  |  | | 
|+-----+------+------+-----+------+-----+-----+------+-----+-----+ | 
||2000 |45.1 |46.1 |25.1 |13.442|14.94|15.02|13 |17 |14 | | 
|+-----+------+------+-----+------+-----+-----+------+-----+-----+ | 
||2001 |85.0 |16.0 |49.0 |13.380|14.81|15.14|12 |15 |17 | | 
|+-----+------+------+-----+------+-----+-----+------+-----+-----+ | 
||2002 |90.0 |33.0 |82.0 |13.590|15.13|14.88|15 |22 |10 | | 
|+-----+------+------+-----+------+-----+-----+------+-----+-----+ | 
||2003 |47.0 |34.0 |78.0 |13.640|14.83|15.27|17 |16 |22 | | 
|+-----+------+------+-----+------+-----+-----+------+-----+-----+ | 
+-------------------------------------------------------------------+ 

Quello che voglio

+------------------------------------------------------------------+ 
|+-----+------+------+----+------+------+-----+------+------+----+ | 
||month|1Jan    |Feb    |Mar    || 
|+-----+------+------+----+------+------+-----+------+------+----+ | 
||  |weight|extent|rank|weight|extent|rank |weight|extent|rank| | 
|+-----+------+------+----+------+------+-----+------+------+----+ | 
||year |  |  | |  |  |  |  |  | | | 
|+-----+------+------+----+------+------+-----+------+------+----+ | 
||2000 |45.1 |13.442|13 |46.1 |14.94 |17 | 25.1 |15.02 |14 | | 
|+-----+------+------+----+------+------+-----+------+------+----+ | 
||2001 |85.0 |13.380|12 |16.0 |14.81 |15 | 49.0 |15.14 |17 | | 
|+-----+------+------+----+------+------+-----+------+------+----+ | 
||2002 |90.0 |13.590|15 |33.0 |15.13 |22 | 82.0 |14.88 |10 | | 
|+-----+------+------+----+------+------+-----+------+------+----+ | 
||2003 |47.0 |13.640|17 |34.0 |14.83 |16 | 78.0 |15.27 |22 | | 
|+-----+------+------+-----------+------+-----+------+------+----+ | 
+------------------------------------------------------------------+ 

Qualsiasi aiuto sarebbe apprezzato. Posso lavorare con il mio DataFrame originale, ma scrivere in un CSV con l'ordine desiderato sarebbe fantastico.

Grazie in anticipo, Matt

+0

http://pandas.pydata.org/ pandas-docs/stable/generated/pandas.DataFrame.swaplevel.html –

risposta

13

Le colonne sono una MultiIndex. È necessario riassegnare le colonne del dataframe con una nuova MultiIndex creati da scambiano i livelli di quello esistente:

df.columns = df.columns.swaplevel(0, 1) 
df.sortlevel(0, axis=1, inplace=True) 
>>> df 

month '1Jan'     'Feb'     'Mar'    
     weight extent rank weight extent rank weight extent rank 
year                  
2000  45.1 13.442 13 46.1 14.94 17 25.1 15.02 14 
2001  85.0 13.380 12 16.0 14.81 15 49.0 15.14 17 
2002  90.0 13.590 15 33.0 15.13 22 82.0 14.88 10 
2003  47.0 13.640 17 34.0 14.83 16 78.0 15.27 22 

È possibile quindi esportare in formato CSV:

df.to_csv(filename) 
+0

Avevo lo swaplevel, ma non avevo il sortlevel. Grazie mille. –

+0

Nota, sortlevel è deprecato ora, questo è ora eseguibile tramite: df.sort_index (axis = 1, level = 0, inplace = True) – Silas

Problemi correlati