import numpy as np
import pandas as pd
data=pd.DataFrame(np.arange(6).reshape((3,2)),index=pd.Index(['a','b','c'],name='state'),columns=pd.Index(['I','II'],name='number'))
data
Out[627]:
number I II
state
a 0 1
b 2 3
c 4 5
result=data.unstack()
result
Out[628]:
number state
I a 0
b 2
c 4
II a 1
b 3
c 5
type(result) #pandas.core.series.Series。 DataFrame 被 stack成拥有二重MultiIndex的Series。
df=pd.DataFrame({'left':result,'right':result+5},columns=pd.Index(['left','right'],name='side'))
df
Out[630]:
side left right
number state
I a 0 5
b 2 7
c 4 9
II a 1 6
b 3 8
c 5 10
df.stack() #结果是一个三重index的series
Out[633]:
number state side
I a left 0
right 5
b left 2
right 7
c left 4
right 9
II a left 1
right 6
b left 3
right 8
c left 5
right 10
df.stack().unstack('side') # 如果想把side作为列变量,那就stack('side')
Out[636]:
side left right
number state
I a 0 5
b 2 7
c 4 9
II a 1 6
b 3 8
c 5 10
df.unstack('number').stack('number') #更改了multiindex的顺序。先把'number'作为列的index,再拿下来作为行的index,就更改了在index中出现的顺序。
Out[638]:
side left right
state number
a I 0 5
II 1 6
b I 2 7
II 3 8
c I 4 9
II 5 10
df #注意和上面比较一下。
Out[639]:
side left right
number state
I a 0 5
b 2 7
c 4 9
II a 1 6
b 3 8
c 5 10