如何更改pandas MultiIndex列的顺序/分组/级别?

Mat*_*oie 19 python pandas

我正在尝试在pandas数据帧中重新排序/ swaplevel/pivot/something列.列是一个MultiIndex,但我找不到酱油做我想要的.

我的multiIndex中变化最快的列是月份,但我希望它是最慢的变量列.

如果你想自己尝试一下,我有一个nbviewer笔记本:http://nbviewer.ipython.org/gist/flamingbear/4cfac24c80fe34a67474

是)我有的:

+-------------------------------------------------------------------+
|+-----+------+------+-----+------+-----+-----+------+-----+-----+  |
||     |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   |  |
|+-----+------+------+-----+------+-----+-----+------+-----+-----+  |
+-------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我想要的是

+------------------------------------------------------------------+
|+-----+------+------+----+------+------+-----+------+------+----+ |
||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  | |
|+-----+------+------+-----------+------+-----+------+------+----+ |
+------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.我可以使用我原来的DataFrame,但写入具有所需顺序的CSV将是非常棒的.

先谢谢,马特

Ale*_*der 27

您的列是MultiIndex.您需要使用通过交换现有级别创建的新MultiIndex重新分配DataFrame的列:

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以导出到csv:

df.to_csv(filename)
Run Code Online (Sandbox Code Playgroud)

编辑

根据以下@Silas的评论,sortlevel已被弃用.相反,使用:

df.sort_index(axis=1, level=0, inplace=True)
Run Code Online (Sandbox Code Playgroud)

  • 注意,sortlevel现在已弃用,现在可通过以下方式实现:df.sort_index(axis = 1,level = 0,inplace = True) (3认同)

Meh*_*i S 9

由于级别索引不再是强制性的,您可以使用更简单的方法来实现多索引数据帧的级别交换:

df = df.swaplevel(axis='columns')
Run Code Online (Sandbox Code Playgroud)