多级索引的数据透视表排序

3

我将尝试在将两个“行标签”(Excel术语)放在数据透视表中后,按降序排列透视表的值。

示例数据:

x = pd.DataFrame({'col1':['a','a','b','c','c', 'a','b','c', 'a','b','c'],
                  'col2':[  1,  1,  1,  1,  1,   2,  2,  2,   3,  3,  3],
                  'col3':[  1,.67,0.5,  2,.65, .75,2.25,2.5, .5,  2,2.75]})
print(x)
   col1  col2  col3
0     a     1  1.00
1     a     1  0.67
2     b     1  0.50
3     c     1  2.00
4     c     1  0.65
5     a     2  0.75
6     b     2  2.25
7     c     2  2.50
8     a     3  0.50
9     b     3  2.00
10    c     3  2.75

为了创建数据透视表,我正在使用以下函数:
pt = pd.pivot_table(x, index = ['col1', 'col2'], values = 'col3', aggfunc = np.sum)
print(pt)
           col3
col1 col2      
a    1     1.67
     2     0.75
     3     0.50
b    1     0.50
     2     2.25
     3     2.00
c    1     2.65
     2     2.50
     3     2.75

以简单的语言来解释,变量pt首先按照col1进行排序,然后在col1中按照col2的值进行排序,最后在所有这些值中按照col3进行排序。这很好,但我想按照col3(值)排序,同时保留在col2中分组的数据(此列可以任意顺序和随机排列)。
目标输出应该类似于以下内容(按照col3降序排列,col2中任意顺序与该组col1一起):
                   col3
    col1   col2    
     a       1     1.67
             2     0.75
             3     0.50

     b       2     2.25
             3     2.00 
             1     0.50

     c       3     2.75
             1     2.65
             2     2.50 

我尝试了下面的代码,但这只是对整个数据透视表值进行排序,并且失去了分组(我想要在分组内进行排序)。
    pt.sort_values(by = 'col3', ascending = False)

为了指导,类似的问题在这里被问到(并被回答),但是我无法通过提供的输出得到成功的结果:

Pandas: 排序透视表

我从那个答案中得到的错误是ValueError:所有键都需要具有相同的形状

1个回答

2
你需要使用 reset_index 函数来重置 DataFrame 的索引,然后用 sort_values 函数按照 col1col3 进行排序,最后使用 set_index 函数来设置 MultiIndex 索引。
df = df.reset_index()
       .sort_values(['col1','col3'], ascending=[True, False])
       .set_index(['col1','col2'])

print (df)
           col3
col1 col2      
a    1     1.67
     2     0.75
     3     0.50
b    2     2.25
     3     2.00
     1     0.50
c    3     2.75
     1     2.65
     2     2.50

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接