Pandas:如何创建多索引枢轴

Posted

技术标签:

【中文标题】Pandas:如何创建多索引枢轴【英文标题】:Pandas: How to create a multi-indexed pivot 【发布时间】:2016-11-07 09:57:42 【问题描述】:

我有一组由两个变量定义的实验:scenarioheight。对于每个实验,我进行 3 次测量:结果 1、2 和 3。 收集所有结果的数据框如下所示:

import numpy as np
import pandas as pd

df = pd.DataFrame()
df['Scenario']= np.repeat(['Scenario a','Scenario b','Scenario c'],3)
df['height'] = np.tile([0,1,2],3)
df['Result 1'] = np.arange(1,10)
df['Result 2'] = np.arange(20,29)
df['Result 3'] = np.arange(30,39)

如果我运行以下命令:

mypiv = df.pivot('Scenario','height').transpose()
writer = pd.ExcelWriter('test_df_pivot.xlsx')
mypiv.to_excel(writer,'test df pivot')
writer.save()

我获得了一个数据框,其中列是scenarios,并且行具有由resultheight 定义的多索引:

+----------+--------+------------+------------+------------+
|          | height | Scenario a | Scenario b | Scenario c |
+----------+--------+------------+------------+------------+
| Result 1 |      0 |          1 |          4 |          7 |
|          |      1 |          2 |          5 |          8 |
|          |      2 |          3 |          6 |          9 |
| Result 2 |      0 |         20 |         23 |         26 |
|          |      1 |         21 |         24 |         27 |
|          |      2 |         22 |         25 |         28 |
| Result 3 |      0 |         30 |         33 |         36 |
|          |      1 |         31 |         34 |         37 |
|          |      2 |         32 |         35 |         38 |
+----------+--------+------------+------------+------------+

如何创建交换索引的枢轴,即首先是height,然后是result

我找不到直接创建它的方法。我设法得到了我想要的交换关卡并重新排序结果:

mypiv2 = mypiv.swaplevel(0,1 , axis=0).sortlevel(level=0,axis=0,sort_remaining=True)

但我想知道是否有更直接的方法。

【问题讨论】:

【参考方案1】:

你可以先set_index 然后stackunstack:

print (df.set_index(['height','Scenario']).stack().unstack(level=1))
Scenario         Scenario a  Scenario b  Scenario c
height                                             
0      Result 1           1           4           7
       Result 2          20          23          26
       Result 3          30          33          36
1      Result 1           2           5           8
       Result 2          21          24          27
       Result 3          31          34          37
2      Result 1           3           6           9
       Result 2          22          25          28
       Result 3          32          35          38

【讨论】:

以上是关于Pandas:如何创建多索引枢轴的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个索引更新多索引数据框中的记录

将数据分组到 Pandas 多索引

Pandas 重置系列索引以删除多索引

Pandas 重置系列索引以删除多索引

对多索引数据透视表 pandas 进行排序

Pandas 多索引数据框 - 从多索引中的一个索引中选择最大值