我有以下数据框。
df = pd.DataFrame({'mean':np.arange(0,12),
'lo':np.arange(12,24),
'hi':np.arange(24,36),
'prop':['prop1']*6+['prop2']*6,
'group':['group1','group2','group3']*4,
'type':['type1','type2']*6})'effect_size'
df.head()
输出。
mean lo hi prop group type
0 0 12 24 prop1 group1 type1
1 1 13 25 prop1 group2 type2
2 2 14 26 prop1 group3 type1
3 3 15 27 prop1 group1 type2
4 4 16 28 prop1 group2 type1
我想对表进行数据透视,使产生的表有这些列(所需输出):
type1 type2
group1 group2 group3 group1 group2 group3
mean lo hi mean lo hi mean lo hi mean lo hi mean lo hi mean lo hi
prop1 0 12 24 4 16 28 2 14 26 3 15 27 1 13 25 5 17 29
prop2 6 18 30 10 22 34 8 20 32 9 21 33 7 19 31 11 23 35
我试过用 pivot()
(由于索引值重复,无法使用),以及 pivot_table()
:
df2 = df.pivot_table(index='prop',columns=['group','type'], values=['mean','lo','hi'])
df2
输出。
hi lo mean
group group1 group2 group3 group1 group2 group3 group1 group2 group3
type type1 type2 type1 type2 type1 type2 type1 type2 type1 type2 type1 type2 type1 type2 type1 type2 type1 type2
prop
prop1 24 27 28 25 26 29 12 15 16 13 14 17 0 3 4 1 2 5
prop2 30 33 34 31 32 35 18 21 22 19 20 23 6 9 10 7 8 11
结果是我想要的,只是各栏的顺序不正确,难以阅读。我怎样才能重新排列 df2
以获得我想要的输出?
我已经尝试过 reindex()
的MultiIndex索引,但我最终得到的是一个充满NaNs的表。
pandas pivoting表总是对索引和列名进行排序。如果你想得到你想要的输出,你需要对输出进行后处理。
使用 swaplevel
, sort_index
和 reindex
的输出 pivot_table
df3 = (df2.swaplevel(0,2, axis=1).sort_index(1)
.reindex(['mean','lo','hi'], level=2, axis=1))
Out[107]:
type type1 type2 \
group group1 group2 group3 group1 group2
mean lo hi mean lo hi mean lo hi mean lo hi mean lo
prop
prop1 0 12 24 4 16 28 2 14 26 3 15 27 1 13
prop2 6 18 30 10 22 34 8 20 32 9 21 33 7 19
type
group group3
hi mean lo hi
prop
prop1 25 5 17 29
prop2 31 11 23 35