我有一个用
读入的数据集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级。这是怎么回事?
答案 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()