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