
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',)
今回は、こんなところで。