
Advent Calendar 2013 - 5
Python で解析! - DataFrame 3
今回は、任意の行を抽出する方法について。 SQL だと where で指定するフィルターのようなものかな。
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. 任意の行を選択
まずは、特定の行を取り出す。R は 1 から始まるが、Pandas では 0 から始まるという微妙な差がある。
df.iloc[2]
体重 51
名前 佐藤
性別 女
身長 159
Name: 2, dtype: object
配列を渡して、任意の複数行を取り出すこともできる。
df.iloc[[3,1]]
体重 名前 性別 身長
3 52 木村 女 164
1 71 鈴木 男 173
範囲指定で取り出すことも可能。R では "以上:以下" で指定するが、 Pandas では "以上:未満" で指定する。
df.iloc[1:3]
体重 名前 性別 身長
1 71 鈴木 男 173
2 51 佐藤 女 159
3. 条件に合致した行を選択
df.loc[df[u'身長']>170]
体重 名前 性別 身長
0 79 山田 男 181
1 71 鈴木 男 173
df.loc[df[u'性別']==u'女']
体重 名前 性別 身長
2 51 佐藤 女 159
3 52 木村 女 164
4. 条件に合致した行の特定の列を選択
df.loc[df[u'性別']==u'女', u'体重']
2 51
3 52
Name: 体重, dtype: int64
df.loc[df[u'性別']==u'女', [u'身長',u'体重']]
身長 体重
2 159 51
3 164 52
5. そして、要約統計量
行列を選択した結果は DataFrame が返ってくる。なので、そのまま DataFrame の関数が使える。
df.loc[df[u'性別']==u'女', [u'身長',u'体重']].describe()
身長 体重
count 2.000000 2.000000
mean 161.500000 51.500000
std 3.535534 0.707107
min 159.000000 51.000000
25% 160.250000 51.250000
50% 161.500000 51.500000
75% 162.750000 51.750000
max 164.000000 52.000000
今回は、こんなところで。