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

from numpy.random import randn
In [2]:
# 階層構造があるindexを作ることができます。
ser = Series(np.random.randn(6),index=[[1,1,1,2,2,2],['a','b','c','a','b','c']])
In [4]:
# どうなっているか見てみましょう。
ser
Out[4]:
1  a   -0.911540
   b   -0.202439
   c    0.448352
2  a    0.127942
   b    1.473788
   c    2.051937
dtype: float64
In [6]:
# indexだけ表示してみます。
ser.index
Out[6]:
MultiIndex(levels=[[1, 2], ['a', 'b', 'c']],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])
In [7]:
# これを利用できます。
ser[1]
Out[7]:
a   -0.911540
b   -0.202439
c    0.448352
dtype: float64
In [8]:
ser[2]
Out[8]:
a    0.127942
b    1.473788
c    2.051937
dtype: float64
In [9]:
ser
Out[9]:
1  a   -0.911540
   b   -0.202439
   c    0.448352
2  a    0.127942
   b    1.473788
   c    2.051937
dtype: float64
In [16]:
# We can also select from an internal index level
ser[:,'a']
Out[16]:
1   -1.337299
2    0.457808
dtype: float64
In [10]:
# このSeriesをもとに、DataFrameを作れます。
dframe = ser.unstack()
dframe
Out[10]:
a b c
1 -0.911540 -0.202439 0.448352
2 0.127942 1.473788 2.051937
In [12]:
# 逆もできます。
dframe.T.unstack()
Out[12]:
1  a   -0.911540
   b   -0.202439
   c    0.448352
2  a    0.127942
   b    1.473788
   c    2.051937
dtype: float64
In [13]:
#  DataFrameにも階層的なindexを作れます。
dframe2 = DataFrame(np.arange(16).reshape(4,4),
                    index=[['a','a','b','b'],[1,2,1,2]],
                    columns=[['NY','NY','LA','SF'],['cold','hot','hot','cold']])
dframe2                                                
Out[13]:
NY LA SF
cold hot hot cold
a 1 0 1 2 3
2 4 5 6 7
b 1 8 9 10 11
2 12 13 14 15
In [14]:
#階層的なindexに名前を付けられます。
# 行方向の名前
dframe2.index.names = ['INDEX_1','INDEX_2']
# 列方向の名前
dframe2.columns.names = ['Cities','Temp']
dframe2
Out[14]:
Cities NY LA SF
Temp cold hot hot cold
INDEX_1 INDEX_2
a 1 0 1 2 3
2 4 5 6 7
b 1 8 9 10 11
2 12 13 14 15
In [17]:
# 階層構造を逆にすることができます。今回は列方向で試します。
dframe2.swaplevel('Cities','Temp',axis=1)
Out[17]:
Temp cold hot cold
Cities NY NY LA SF
INDEX_1 INDEX_2
a 1 0 1 2 3
2 4 5 6 7
b 1 8 9 10 11
2 12 13 14 15
In [19]:
#We can also sort levels
dframe2.sortlevel(1)
Out[19]:
Cities NY LA SF
Temp cold hot hot cold
INDEX_1 INDEX_2
a 1 0 1 2 3
b 1 8 9 10 11
a 2 4 5 6 7
b 2 12 13 14 15
In [21]:
dframe2.sortlevel(1).sortlevel(0)
Out[21]:
Cities NY LA SF
Temp cold hot hot cold
INDEX_1 INDEX_2
a 1 0 1 2 3
2 4 5 6 7
b 1 8 9 10 11
2 12 13 14 15
In [20]:
#レベルに応じて計算も出来ます。
dframe2.sum(level='Temp',axis=1)
Out[20]:
Temp cold hot
INDEX_1 INDEX_2
a 1 3 3
2 11 11
b 1 19 19
2 27 27