In [1]:
import numpy as np
import pandas as pd
from pandas import Series,DataFrame

In [2]:
df1 = DataFrame(np.arange(8).reshape(2,4),
                index=pd.Index(['LA','SF'],name='city'),
                columns=pd.Index(['A','B','C','D'],name='letters'))
df1


Out[2]:
letters A B C D
city
LA 0 1 2 3
SF 4 5 6 7

In [3]:
df_st = df1.stack()

df_st


Out[3]:
city  letters
LA    A          0
      B          1
      C          2
      D          3
SF    A          4
      B          5
      C          6
      D          7
dtype: int32

In [4]:
df_st.unstack()


Out[4]:
letters A B C D
city
LA 0 1 2 3
SF 4 5 6 7

In [6]:
df_st.unstack('letters')


Out[6]:
letters A B C D
city
LA 0 1 2 3
SF 4 5 6 7

In [7]:
df_st.unstack('city')


Out[7]:
city LA SF
letters
A 0 4
B 1 5
C 2 6
D 3 7

In [8]:
# how to stack/unstack handle null values
ser1 = Series([0,1,2],index=['Q','X','Y'])

In [9]:
ser2 = Series([4,5,6],index=['X','Y','Z'])

In [10]:
ser1


Out[10]:
Q    0
X    1
Y    2
dtype: int64

In [11]:
ser2


Out[11]:
X    4
Y    5
Z    6
dtype: int64

In [12]:
df = pd.concat([ser1,ser2], keys=['Alpha','Bravo'])

df


Out[12]:
Alpha  Q    0
       X    1
       Y    2
Bravo  X    4
       Y    5
       Z    6
dtype: int64

In [13]:
df.unstack()


Out[13]:
Q X Y Z
Alpha 0.0 1.0 2.0 NaN
Bravo NaN 4.0 5.0 6.0

In [15]:
# remove null values while stacking
df.unstack().stack()


Out[15]:
Alpha  Q    0.0
       X    1.0
       Y    2.0
Bravo  X    4.0
       Y    5.0
       Z    6.0
dtype: float64

In [16]:
# keep null values while stacking
df.unstack().stack(dropna=False)


Out[16]:
Alpha  Q    0.0
       X    1.0
       Y    2.0
       Z    NaN
Bravo  Q    NaN
       X    4.0
       Y    5.0
       Z    6.0
dtype: float64

In [ ]: