2017-07-25 95 views
2

我试图在将两个“行标签”(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排序,然后通过数值col2col1之内,然后在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: Sort pivot table

我从得到的错误答案是ValueError: all keys need to be the same shape

回答

1

您可以通过col1col3和最后需要reset_indexDataFrame,然后为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