2017-07-25 134 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