このエントリーをはてなブックマークに追加

Advent Calendar 2013 - 6

Python で解析! - DataFrame 4

今回は、ここまでの復習と補足説明といったところ。

1. データの準備

では、いつもの通りのデータの準備を。

import pandas as pd

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

2. Series と DataFrame

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

type(df)

pandas.core.frame.DataFrame

DataFrame の列も確認してみる。

type(df[u'名前'])

pandas.core.series.Series

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

type(df.iloc[1])

pandas.core.series.Series

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

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

df[u'体重'].sum()
253
df[u'体重'].describe()
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. 条件に合致した行を選択…の補足

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

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

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

df[u'身長']>170
0     True
1     True
2    False
3    False
Name: 身長, dtype: bool
type(df[u'身長']>170)

pandas.core.series.Series

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

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

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

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

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