Python で解析 6

“Advent Calendar 2013 - Python で解析!” の六日目。Pandas で DataFrame - 4

1. お決まりの準備を…

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({
   ...: u'名前': [u'山田', u'鈴木', u'佐藤', u'木村'],
   ...: u'性別': [u'男', u'男', u'女', u'女'] ,
   ...: u'身長': [181, 173, 159, 164],
   ...: u'体重': [79, 71, 51, 52]
   ...: })

In [3]: df
Out[3]:
   体重  名前 性別   身長
0  79  山田  男  181
1  71  鈴木  男  173
2  51  佐藤  女  159
3  52  木村  女  164

2. Series と DataFrame

ここまで便利に DataFrame を使ってきたが、念のために確認しておく。

In [4]: type(df)
Out[4]: pandas.core.frame.DataFrame

DataFrame の列も確認してみる。

In [5]: type(df[u'名前'])
Out[5]: pandas.core.series.Series

Series が返って来るようだ。DataFrame も Series も Pandas で定義されていて、 Series は一次元のデータを取り扱う。

In [6]: type(df.iloc[1])
Out[6]: pandas.core.series.Series

行を取り出しても Series になっている。

これまで DataFrame の関数を呼び出していたが、実は Series にも使える。

In [7]: df[u'体重'].sum()
Out[7]: 253

In [8]: df[u'体重'].describe()
Out[8]:
count     4.000000
mean     63.250000
std      13.961256
min      51.000000
25%      51.750000
50%      61.500000
75%      73.000000
max      79.000000
dtype: float64

どうやら、 DataFrame の同等の関数は、各 Series の関数を呼び出して、その結果を表示していたようだ。

3. 条件に合致した行を選択…の補足

前回、条件に合致した行の選択方法を書いた。

In [9]: df.loc[df[u'身長']>170]
Out[9]:
   体重  名前 性別   身長
0  79  山田  男  181
1  71  鈴木  男  173

試しに、この条件文だけを実行してみる。

In [10]: df[u'身長']>170
Out[10]:
0     True
1     True
2    False
3    False
Name: 身長, dtype: bool

In [11]: type(df[u'身長']>170)
Out[11]: pandas.core.series.Series

bool の Series が戻ってくる。どうやら条件を渡して行を選択しているというよりも、 bool の配列を使ってマスクして行を抽出しているようだ。試しに、条件文の代わりに bool の配列を渡してみると、こうなる。

In [12]: df.loc[[True, True, False, False]]
Out[12]:
   体重  名前 性別   身長
0  79  山田  男  181
1  71  鈴木  男  173


ただし、この配列は行数に一致していなければならない。試してみると、エラーが表示される。

In [13]: df.loc[[True, True, False, False, True]]
Out[13]:
# (中略)
KeyError: Exception('Indices must be nonzero and less than the axis length',)

今回は、こんなところで。