Python 如何避免按索引对数据透视表排序

Python 如何避免按索引对数据透视表排序,python,pandas,Python,Pandas,我有一个数据帧: t1=r.data[(r.data['test_num']==2) & (r.data['el_num'] < 4)] test_num el_num file_num dose is_anneal value fail 99 2 1 0 100.0 False -0.000056 False 100 2 1 1 5

我有一个数据帧:

t1=r.data[(r.data['test_num']==2) & (r.data['el_num'] < 4)]

     test_num  el_num  file_num     dose  is_anneal     value   fail
99          2       1         0    100.0      False -0.000056  False
100         2       1         1   5052.0      False -0.000056  False
101         2       1         2  10107.0      False -0.000056  False
102         2       1         3  16561.0      False -0.000056  False
103         2       1         4  22536.0      False -0.000056  False
104         2       1         5  25020.0      False -0.000056  False
105         2       1         6  35123.0      False -0.000056  False
106         2       1         7     24.0       True -0.000056  False
107         2       1         8    168.0       True -0.000055  False
108         2       2         0    100.0      False -0.000056  False
109         2       2         1   5052.0      False -0.000056  False
110         2       2         2  10107.0      False -0.000056  False
111         2       2         3  16561.0      False -0.000056  False
112         2       2         4  22536.0      False -0.000056  False
113         2       2         5  25020.0      False -0.000056  False
114         2       2         6  35123.0      False -0.000056  False
115         2       2         7     24.0       True -0.000056  False
116         2       2         8    168.0       True -0.000055  False
117         2       3         0    100.0      False -0.000060  False
118         2       3         1   5052.0      False -0.000061  False
119         2       3         2  10107.0      False -0.000061  False
120         2       3         3  16561.0      False -0.000061  False
121         2       3         4  22536.0      False -0.000061  False
122         2       3         5  25020.0      False -0.000061  False
123         2       3         6  35123.0      False -0.000061  False
124         2       3         7     24.0       True -0.000061  False
125         2       3         8    168.0       True -0.000061  False
但是我希望
dose
列的顺序与主表中的顺序相同:

100.0
5052.0
10107.0
16561.0
22536.0
25020.0
35123.0
24.0
168.0

如何避免在数据透视表中排序?

您可以使用类似的解决方案
数据透视表
,但如果重复,则聚合值:

df = t1.groupby(['dose','el_num'], sort=False)['value'].mean().unstack()
print (df)
el_num          1         2         3
dose                                 
100.0   -0.000056 -0.000056 -0.000060
5052.0  -0.000056 -0.000056 -0.000061
10107.0 -0.000056 -0.000056 -0.000061
16561.0 -0.000056 -0.000056 -0.000061
22536.0 -0.000056 -0.000056 -0.000061
25020.0 -0.000056 -0.000056 -0.000061
35123.0 -0.000056 -0.000056 -0.000061
24.0    -0.000056 -0.000056 -0.000061
168.0   -0.000055 -0.000055 -0.000061
另一种解决方案是使用
pivot
,然后按自定义顺序:

a = t1.loc[t1['el_num'] == 1,'dose']

df = t1.pivot(index='dose',columns='el_num',values='value').reindex(a)
print (df)
el_num          1         2         3
dose                                 
100.0   -0.000056 -0.000056 -0.000060
5052.0  -0.000056 -0.000056 -0.000061
10107.0 -0.000056 -0.000056 -0.000061
16561.0 -0.000056 -0.000056 -0.000061
22536.0 -0.000056 -0.000056 -0.000061
25020.0 -0.000056 -0.000056 -0.000061
35123.0 -0.000056 -0.000056 -0.000061
24.0    -0.000056 -0.000056 -0.000061
168.0   -0.000055 -0.000055 -0.000061

由于
文件\u num
已按所需顺序排序,因此可以使用

(t1.set_index(['file_num','dose','el_num']['value']
   .unstack('el_num').reset_index('file_num', drop=True))
产生

el_num          1         2         3
dose                                 
100.0   -0.000056 -0.000056 -0.000060
5052.0  -0.000056 -0.000056 -0.000061
10107.0 -0.000056 -0.000056 -0.000061
16561.0 -0.000056 -0.000056 -0.000061
22536.0 -0.000056 -0.000056 -0.000061
25020.0 -0.000056 -0.000056 -0.000061
35123.0 -0.000056 -0.000056 -0.000061
24.0    -0.000056 -0.000056 -0.000061
168.0   -0.000055 -0.000055 -0.000061
set\u index/unstack
操作类似于旋转,只是它允许使用多个列作为索引<包含代码>文件\u num以强制执行所需的行顺序

el_num          1         2         3
dose                                 
100.0   -0.000056 -0.000056 -0.000060
5052.0  -0.000056 -0.000056 -0.000061
10107.0 -0.000056 -0.000056 -0.000061
16561.0 -0.000056 -0.000056 -0.000061
22536.0 -0.000056 -0.000056 -0.000061
25020.0 -0.000056 -0.000056 -0.000061
35123.0 -0.000056 -0.000056 -0.000061
24.0    -0.000056 -0.000056 -0.000061
168.0   -0.000055 -0.000055 -0.000061