¿Cómo cambio el orden / agrupamiento / nivel de las columnas MultiIndex de pandas?

Estoy tratando de reordenar las columnas / swaplevel / pivot / something en un dataframe de pandas. Las columnas son un MultiIndex, pero no puedo encontrar la salsa para hacer lo que quiero.

La columna de variación más rápida en mi índice múltiple es el mes, pero me gustaría que fuera la columna de variación más lenta.

Tengo un cuaderno nbviewer si quiere probarlo usted mismo: http://nbviewer.ipython.org/gist/flamingbear/4cfac24c80fe34a67474

Lo que tengo:

+-------------------------------------------------------------------+ |+-----+------+------+-----+------+-----+-----+------+-----+-----+ | || |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 | | |+-----+------+------+-----+------+-----+-----+------+-----+-----+ | +-------------------------------------------------------------------+ 

Lo que quiero

 +------------------------------------------------------------------+ |+-----+------+------+----+------+------+-----+------+------+----+ | ||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 | | |+-----+------+------+-----------+------+-----+------+------+----+ | +------------------------------------------------------------------+ 

Cualquier ayuda sería apreciada. Puedo trabajar con mi DataFrame original, pero escribir en un CSV con el orden deseado sería fantástico.

Gracias de antemano, Matt

Tus columnas son un MultiIndex. Debe reasignar las columnas de DataFrame con un nuevo índice múltiple creado a partir de los niveles de intercambio de los existentes:

 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 

A continuación, puede exportar a csv:

 df.to_csv(filename) 

EDITAR

Según el comentario de @Silas a continuación, el nivel de sortlevel ha quedado en desuso. En su lugar, utilice:

 df.sort_index(axis=1, level=0, inplace=True)