pandas 中 stack 和 unstack的用法


 
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   

猜你喜欢

转载自blog.csdn.net/zhanshirj/article/details/73456800