In [1]:
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
In [2]:
# サンプルを作ります。
dframe1 = DataFrame(np.arange(8).reshape((2, 4)),
                 index=pd.Index(['LA', 'SF'], name='city'),
                 columns=pd.Index(['A', 'B', 'C','D'], name='letter'))
dframe1
Out[2]:
letter A B C D
city
LA 0 1 2 3
SF 4 5 6 7
In [7]:
# stackを使うと、列名をindexにしてSeriesが作れます。
dframe_st = dframe1.stack()
type(dframe_st)
Out[7]:
pandas.core.series.Series
In [9]:
dframe_st
Out[9]:
city  letter
LA    A         0
      B         1
      C         2
      D         3
SF    A         4
      B         5
      C         6
      D         7
dtype: int64
In [10]:
# unstackを使うと、元にもどります。
dframe_st.unstack()
Out[10]:
letter A B C D
city
LA 0 1 2 3
SF 4 5 6 7
In [13]:
#レベルを選べます。
dframe_st.unstack(0)
Out[13]:
city LA SF
letter
A 0 4
B 1 5
C 2 6
D 3 7
In [14]:
# 名前の指定も可能です。
dframe_st.unstack('letter')
Out[14]:
letter A B C D
city
LA 0 1 2 3
SF 4 5 6 7
In [15]:
dframe_st.unstack('city')
Out[15]:
city LA SF
letter
A 0 4
B 1 5
C 2 6
D 3 7
In [17]:
# NaNの扱い
ser1 = Series([0, 1, 2], index=['Q', 'X', 'Y'])
ser2 = Series([4, 5, 6], index=['X', 'Y', 'Z'])

dframe = pd.concat([ser1, ser2], keys=['Alpha', 'Beta'])
dframe
Out[17]:
Alpha  Q    0
       X    1
       Y    2
Beta   X    4
       Y    5
       Z    6
dtype: int64
In [18]:
# unstackでDataFrameができます。
dframe.unstack()
Out[18]:
Q X Y Z
Alpha 0 1 2 NaN
Beta NaN 4 5 6
In [19]:
# stackは、デフォルトでNaNを取り除きます。
dframe.unstack().stack()
Out[19]:
Alpha  Q    0
       X    1
       Y    2
Beta   X    4
       Y    5
       Z    6
dtype: float64
In [20]:
# この動きを抑制することもできます。
dframe.unstack().stack(dropna=False)
Out[20]:
Alpha  Q     0
       X     1
       Y     2
       Z   NaN
Beta   Q   NaN
       X     4
       Y     5
       Z     6
dtype: float64