在 pivot_table 之后对 MultiIndex 列进行排序
Posted
技术标签:
【中文标题】在 pivot_table 之后对 MultiIndex 列进行排序【英文标题】:ordering the MultiIndex columns after pivot_table 【发布时间】:2020-08-31 15:38:39 【问题描述】:我有以下数据框:
df = pd.DataFrame('mean':np.arange(0,12),
'lo':np.arange(12,24),
'hi':np.arange(24,36),
'prop':['prop1']*6+['prop2']*6,
'group':['group1','group2','group3']*4,
'type':['type1','type2']*6)'effect_size'
df.head()
输出:
mean lo hi prop group type
0 0 12 24 prop1 group1 type1
1 1 13 25 prop1 group2 type2
2 2 14 26 prop1 group3 type1
3 3 15 27 prop1 group1 type2
4 4 16 28 prop1 group2 type1
我想旋转表格,以便生成的表格包含这些列(期望的输出):
type1 type2
group1 group2 group3 group1 group2 group3
mean lo hi mean lo hi mean lo hi mean lo hi mean lo hi mean lo hi
prop1 0 12 24 4 16 28 2 14 26 3 15 27 1 13 25 5 17 29
prop2 6 18 30 10 22 34 8 20 32 9 21 33 7 19 31 11 23 35
我尝试过使用pivot()
(由于重复的索引值而无法使用)和pivot_table()
:
df2 = df.pivot_table(index='prop',columns=['group','type'], values=['mean','lo','hi'])
df2
输出:
hi lo mean
group group1 group2 group3 group1 group2 group3 group1 group2 group3
type type1 type2 type1 type2 type1 type2 type1 type2 type1 type2 type1 type2 type1 type2 type1 type2 type1 type2
prop
prop1 24 27 28 25 26 29 12 15 16 13 14 17 0 3 4 1 2 5
prop2 30 33 34 31 32 35 18 21 22 19 20 23 6 9 10 7 8 11
结果是我想要的,只是列的顺序不正确且难以阅读。 如何重新排列df2
的列以获得所需的输出?
我已经尝试使用 MultiIndex 索引 reindex()
,但我最终得到了一个充满 NaN 的表。
【问题讨论】:
【参考方案1】:pandas 数据透视表总是对索引和列名进行排序。如果你想作为你想要的输出,你需要对输出进行后处理。
在pivot_table
的输出上使用swaplevel
、sort_index
和reindex
df3 = (df2.swaplevel(0,2, axis=1).sort_index(1)
.reindex(['mean','lo','hi'], level=2, axis=1))
Out[107]:
type type1 type2 \
group group1 group2 group3 group1 group2
mean lo hi mean lo hi mean lo hi mean lo hi mean lo
prop
prop1 0 12 24 4 16 28 2 14 26 3 15 27 1 13
prop2 6 18 30 10 22 34 8 20 32 9 21 33 7 19
type
group group3
hi mean lo hi
prop
prop1 25 5 17 29
prop2 31 11 23 35
【讨论】:
太棒了。我还没有遇到swaplevel()
。以上是关于在 pivot_table 之后对 MultiIndex 列进行排序的主要内容,如果未能解决你的问题,请参考以下文章