frame = pd.DataFrame(np.arange(12).reshape((4, 3)),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]])
frame
形成一个二维数组
0 1 2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
unstack
unstack先把内层索引逆时针旋转到列索引,内层索引对应几列,就形成几个列索引
这里a对应两个内索引(1,2),所以2*3=6
frame.unstack()
0 1 2
1 2 1 2 1 2
a 0 3 1 4 2 5
b 6 9 7 10 8 11
试试 frame.unstack().unstack()
当行索引无法旋转时,逆时针转动列索引,原来的行索引变成最内侧索引,这个其实又变成一维形态
0 1 a 0
b 6
2 a 3
b 9
1 1 a 1
b 7
2 a 4
b 10
2 1 a 2
b 8
2 a 5
b 11
dtype: int32
type(frame.unstack().unstack())
其实它是具有三个索引的 pandas.core.series.Series结构
再次旋转
frame.unstack().unstack().unstack()
2*1=2列
a b
0 1 0 6
2 3 9
1 1 1 7
2 4 10
2 1 2 8
2 5 11
stack
stack将二维转为一维
frame.stack()
a 1 0 0
1 1
2 2
2 0 3
1 4
2 5
b 1 0 6
1 7
2 8
2 0 9
1 10
2 11
dtype: int32
一维数组无法再次stack()