2015-11-08 101 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