我有一个具有以下索引的数据透视表(mypivot.index的输出):
MultiIndex(levels=[[u'DATASET1', u'DATASET2', u'DATASET3'], [3, 6], [u'ALGO1', u'ALGO2', u'ALGO3']],
labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0]],
names=[u'DATASET', u'FINAL_TIME', u'POLICY'])
mypivot.columns返回时
Index([u'C', u'T1', u'T10', u'T2', u'T3', u'T6'], dtype='object')
这很难读,我想通过以下方式重塑它:
行索引级别:DATASET,FINAL_TIME
列索引级别:政策,处理方法(目前似乎没有名称)
我已经尝试了几种方法,主要是尝试将mypivot用作另一个数据透视表的输入,但是到目前为止还没有奏效。
答案 0 :(得分:0)
使用:
np.random.seed(123)
mux = pd.MultiIndex(levels=[[u'DATASET1', u'DATASET2', u'DATASET3'], [3, 6], [u'ALGO1', u'ALGO2', u'ALGO3']],
labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0]],
names=[u'DATASET', u'FINAL_TIME', u'POLICY'])
idx = pd.Index([u'C', u'T1', u'T10', u'T2', u'T3', u'T6'], dtype='object')
mypivot = pd.DataFrame(np.random.randint(10, size=(6,14)), index=idx, columns=mux)
print (mypivot)
DATASET DATASET1 ... DATASET2 \
FINAL_TIME 3 6 ... 3 6
POLICY ALGO1 ALGO2 ALGO3 ALGO1 ALGO2 ALGO3 ... ALGO3 ALGO1
C 2 2 6 1 3 9 ... 0 1
T1 3 4 0 0 4 1 ... 2 4
T10 0 7 9 3 4 6 ... 6 2
T2 0 2 6 2 4 4 ... 0 6
T3 1 5 7 9 2 4 ... 2 1
T6 0 8 1 6 3 3 ... 7 9
DATASET DATASET3
FINAL_TIME 3 6
POLICY ALGO1 ALGO2 ALGO3 ALGO1
C 9 0 0 9
T1 7 2 4 8
T10 1 8 3 5
T2 4 7 6 7
T3 1 3 5 9
T6 2 3 3 3
[6 rows x 14 columns]
df = mypivot.stack().swaplevel(0,1).sort_index().T
print (df)
POLICY ALGO1 ... ALGO3 \
C T1 T10 T2 T3 T6 ... C T1 T10 T2
DATASET FINAL_TIME ...
DATASET1 3 2.0 3.0 0.0 0.0 1.0 0.0 ... 6.0 0.0 9.0 6.0
6 1.0 0.0 3.0 2.0 9.0 6.0 ... 9.0 1.0 6.0 4.0
DATASET2 3 6.0 7.0 1.0 6.0 8.0 5.0 ... 0.0 2.0 6.0 0.0
6 1.0 4.0 2.0 6.0 1.0 9.0 ... NaN NaN NaN NaN
DATASET3 3 9.0 7.0 1.0 4.0 1.0 2.0 ... 0.0 4.0 3.0 6.0
6 9.0 8.0 5.0 7.0 9.0 3.0 ... NaN NaN NaN NaN
POLICY
T3 T6
DATASET FINAL_TIME
DATASET1 3 7.0 1.0
6 4.0 3.0
DATASET2 3 2.0 7.0
6 NaN NaN
DATASET3 3 5.0 3.0
6 NaN NaN
[6 rows x 18 columns]
详细信息:
使用stack
进行重塑:
print (mypivot.stack())
DATASET DATASET1 DATASET2 DATASET3
FINAL_TIME 3 6 3 6 3 6
POLICY
C ALGO1 2 1 6 1.0 9 9.0
ALGO2 2 3 1 NaN 0 NaN
ALGO3 6 9 0 NaN 0 NaN
T1 ALGO1 3 0 7 4.0 7 8.0
ALGO2 4 4 3 NaN 2 NaN
ALGO3 0 1 2 NaN 4 NaN
T10 ALGO1 0 3 1 2.0 1 5.0
ALGO2 7 4 5 NaN 8 NaN
ALGO3 9 6 6 NaN 3 NaN
T2 ALGO1 0 2 6 6.0 4 7.0
ALGO2 2 4 3 NaN 7 NaN
ALGO3 6 4 0 NaN 6 NaN
T3 ALGO1 1 9 8 1.0 1 9.0
ALGO2 5 2 1 NaN 3 NaN
ALGO3 7 4 2 NaN 5 NaN
T6 ALGO1 0 6 5 9.0 2 3.0
ALGO2 8 3 9 NaN 3 NaN
ALGO3 1 3 7 NaN 3 NaN
...然后在索引MultiIndex
中的swaplevel
print (mypivot.stack().swaplevel(0,1))
DATASET DATASET1 DATASET2 DATASET3
FINAL_TIME 3 6 3 6 3 6
POLICY
ALGO1 C 2 1 6 1.0 9 9.0
ALGO2 C 2 3 1 NaN 0 NaN
ALGO3 C 6 9 0 NaN 0 NaN
ALGO1 T1 3 0 7 4.0 7 8.0
ALGO2 T1 4 4 3 NaN 2 NaN
ALGO3 T1 0 1 2 NaN 4 NaN
ALGO1 T10 0 3 1 2.0 1 5.0
ALGO2 T10 7 4 5 NaN 8 NaN
ALGO3 T10 9 6 6 NaN 3 NaN
ALGO1 T2 0 2 6 6.0 4 7.0
ALGO2 T2 2 4 3 NaN 7 NaN
ALGO3 T2 6 4 0 NaN 6 NaN
ALGO1 T3 1 9 8 1.0 1 9.0
ALGO2 T3 5 2 1 NaN 3 NaN
ALGO3 T3 7 4 2 NaN 5 NaN
ALGO1 T6 0 6 5 9.0 2 3.0
ALGO2 T6 8 3 9 NaN 3 NaN
ALGO3 T6 1 3 7 NaN 3 NaN
...按sort_index
排序:
print (mypivot.stack().swaplevel(0,1).sort_index())
DATASET DATASET1 DATASET2 DATASET3
FINAL_TIME 3 6 3 6 3 6
POLICY
ALGO1 C 2 1 6 1.0 9 9.0
T1 3 0 7 4.0 7 8.0
T10 0 3 1 2.0 1 5.0
T2 0 2 6 6.0 4 7.0
T3 1 9 8 1.0 1 9.0
T6 0 6 5 9.0 2 3.0
ALGO2 C 2 3 1 NaN 0 NaN
T1 4 4 3 NaN 2 NaN
T10 7 4 5 NaN 8 NaN
T2 2 4 3 NaN 7 NaN
T3 5 2 1 NaN 3 NaN
T6 8 3 9 NaN 3 NaN
ALGO3 C 6 9 0 NaN 0 NaN
T1 0 1 2 NaN 4 NaN
T10 9 6 6 NaN 3 NaN
T2 6 4 0 NaN 6 NaN
T3 7 4 2 NaN 5 NaN
T6 1 3 7 NaN 3 NaN
最后由T
转置:
print (mypivot.stack().swaplevel(0,1).sort_index().T)
POLICY ALGO1 ... ALGO3 \
C T1 T10 T2 T3 T6 ... C T1 T10 T2
DATASET FINAL_TIME ...
DATASET1 3 2.0 3.0 0.0 0.0 1.0 0.0 ... 6.0 0.0 9.0 6.0
6 1.0 0.0 3.0 2.0 9.0 6.0 ... 9.0 1.0 6.0 4.0
DATASET2 3 6.0 7.0 1.0 6.0 8.0 5.0 ... 0.0 2.0 6.0 0.0
6 1.0 4.0 2.0 6.0 1.0 9.0 ... NaN NaN NaN NaN
DATASET3 3 9.0 7.0 1.0 4.0 1.0 2.0 ... 0.0 4.0 3.0 6.0
6 9.0 8.0 5.0 7.0 9.0 3.0 ... NaN NaN NaN NaN
POLICY
T3 T6
DATASET FINAL_TIME
DATASET1 3 7.0 1.0
6 4.0 3.0
DATASET2 3 2.0 7.0
6 NaN NaN
DATASET3 3 5.0 3.0
6 NaN NaN
[6 rows x 18 columns]