[英]How do I change order/grouping/level of pandas MultiIndex columns?
我正在嘗試對 pandas dataframe 中的列重新排序/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 | |
|+-----+------+------+-----+------+-----+-----+------+-----+-----+ |
+-------------------------------------------------------------------+
我想要的是
+------------------------------------------------------------------+
|+-----+------+------+----+------+------+-----+------+------+----+ |
||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 | |
|+-----+------+------+-----------+------+-----+------+------+----+ |
+------------------------------------------------------------------+
任何幫助,將不勝感激。 我可以使用我原來的 DataFrame,但是按照所需的順序寫入 CSV 會很棒。
提前致謝, 馬特
您的列是 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
然后您可以導出到 csv:
df.to_csv(filename)
編輯
根據下面sortlevel
的評論,不推薦使用sortlevel
。 相反,使用:
df.sort_index(axis=1, level=0, inplace=True)
由於級別索引不再是強制性的,因此您可以使用更簡單的方法來實現多索引數據幀的級別交換:
df = df.swaplevel(axis='columns')
另一種不需要顯式索引排序的方法是
df.stack(0).unstack()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.