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