pandas pivot表降序python

时间:2015-11-08 04:03:57

标签: python pandas

我有一个用

读入的数据集
data = pd.excel('.../data.xlsx)

然后我用数据透视表组织了everthing

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 
  .....

一切看起来都不错,除非我希望'Conc'列按降序排列,所以不是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级。这是怎么回事?

2 个答案:

答案 0 :(得分:1)

pivot_table的输出是MultiIndex。您希望按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确保其他级别也没有排序,虽然这不是问题(因为它已经在复制时排序)。

答案 1 :(得分: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()