【问题标题】:ordering the MultiIndex columns after pivot_table在 pivot_table 之后对 MultiIndex 列进行排序
【发布时间】: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 的表。

【问题讨论】:

    标签: pandas pivot multi-index


    【解决方案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()
    猜你喜欢
    • 2017-04-28
    • 2015-12-15
    • 2016-04-08
    • 2018-07-03
    • 1970-01-01
    • 2016-12-01
    • 2018-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多