2015-11-08 98 views
1

我有一個數據集,我與大熊貓透視表從大到小的順序蟒蛇

data = pd.excel('.../data.xlsx) 

讀,然後我用透視表組織的寄託都

newdata = data.pivot_table(index=["Block", "Conc", "Replicate"], columns=["Name"], values="F532Mean-B532") ' 

數據透視表看起來是這樣的(實際的表的格式有點不同,我在這裏手動鍵入表格:

Block  conc  replicate  nameA nameB nameC ..  

    1      
      0   1   2225  12  333 
         2   3  423 52 
         3   53  88  239 
      0.01   1   24  53  923 
         2   454  253 53 
         3   4  5  23 
      10   1   34  53  923 
         2   44  253 53 
         3   11  49  232 
    2 
      0   1   234  634  39 
    ..... 

一切看起來都不錯,除了我想要的「濃」列是按降序排列,所以不是0,0.01,10,我想它是10,0.01%,0。

Conc 
    10 

    0.01 

    0 
    ... 

我在網上搜索,發現一對夫婦的職位與這種代碼:

key1 = newdata.index.labels[0] 
    key2 = newdata['Concentration'].rank(ascending=False) 
    sorter = np.lexsort((key2, key1)) 
    sorted_df = newdata.take(sorter) 

    sorted_df.to_excel('pivottable.xlsx') 

的它給了我

KeyError: 'Concentration' 

我認爲問題是,在線例子都只有2個級別,在這裏我有超過2級。這是什麼方法?

+0

@Andy Hayden一個新問題:) – Jessica

回答

1

pivot_table的輸出是MultiIndex。你想在一個多指標水平進行排序,以便您應該使用sortlevel

In [11]: df 
Out[11]: 
         nameA nameB nameC 
Block conc replicate 
1  0.00 1   2225  12 333 
      2    3 423  52 
      3    53  88 239 
     0.01 1    24  53 923 
      2   454 253  53 
      3    4  5  23 
     10.00 1    34  53 923 
      2    44 253  53 
      3    11  49 232 

In [12]: df.sortlevel(["Block", "conc"], ascending=[True, False], sort_remaining=False) 
Out[12]: 
         nameA nameB nameC 
Block conc replicate 
1  10.00 1    34  53 923 
      2    44 253  53 
      3    11  49 232 
     0.01 1    24  53 923 
      2   454 253  53 
      3    4  5  23 
     0.00 1   2225  12 333 
      2    3 423  52 
      3    53  88 239 

注:sort_remaining確保其他級別是不是也進行排序,雖然這不是一個問題(因爲它已經按重複排序)。

+0

一如既往的感謝你! – Jessica

0

您可以使用sort_values()對數據幀進行排序。

df 
Out[10]: 
    Block conc replicate nameA nameB nameC 
0  1 0.00   1 2225  12 333 
1  1 0.00   2  3 423  52 
2  1 0.00   3  53  88 239 
3  1 0.01   1  24  53 923 
4  1 0.01   2 454 253  53 
5  1 0.01   3  4  5  23 
6  1 10.00   1  34  53 923 
7  1 10.00   2  44 253  53 
8  1 10.00   3  11  49 232 

df.sort_values('conc',axis=0,ascending=False) 
Out[11]: 
    Block conc replicate nameA nameB nameC 
6  1 10.00   1  34  53 923 
7  1 10.00   2  44 253  53 
8  1 10.00   3  11  49 232 
3  1 0.01   1  24  53 923 
4  1 0.01   2 454 253  53 
5  1 0.01   3  4  5  23 
0  1 0.00   1 2225  12 333 
1  1 0.00   2  3 423  52 
2  1 0.00   3  53  88 239 

更新: 轉軸df將有多級列。所以,找到newdata.columns您可以使用元組的多列名(LEV1,LEV2)

更新列名: 你必須轉動表多列索引,並試圖與列的一個進行排序。 sort_index()如果重置其他兩個索引,並且如果重置conc,則可以使用sort_values()

+0

我試過了,但我得到了錯誤,我不認爲我可以做到這一點的數據透視表。我希望我的數據透視表輸出'Conc'按降序排列。 – Jessica

+0

@Jessica:你能擺動桌子嗎? – WoodChopper

+0

是的,上面的表是來自我的數據透視表,我不知道如何複製粘貼表在這裏,所以我手動鍵入它,這就是爲什麼格式看起來有點不同 – Jessica