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

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

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