在 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的输出上使用swaplevelsort_indexreindex

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 列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

一文看懂透视表pivot_table

pandas pivot_table透视表crosstab交叉表aggfunc函数详解及实战

pivot_table()到df没有要聚合的数字类型

图解Pandas透视表pivot_table

python对Excel分类汇总

如何在 pandas 的 crosstab/pivot_table 中使用两个不同的函数?