Python で解析 3

“Advent Calendar 2013 - Python で解析!” の三日目。Pandas で DataFrame - 2

1. ファイルの読み込み

CSV (カンマ区切り), TSV (タブ区切り), Excel ファイルなどを読みこんで、 DataFrame を作ることができる。

import pandas as pd

pd = pd.read_csv('hoge.csv')             # CSV ファイルの場合
pd = pd.read_table('hoge.txt')           # TSV ファイルの場合
pd = pd.read_excel('hoge.xls', 'Sheet1') # Excel ファイルの場合

なお、 Excel を読み込む場合は、xlrd パッケージをインストールしておく必要がある。

$ pip install xlrd

他にも、 json や html、クリップボードからの読み込みも可能なのだが、記事の関係上、前回と同様にコードで DataFrame を用意する。今回は日本語を使ってみる。

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. ピボットテーブル

Excel で活用している人も多いと思われるが、エンジニアにとっては Python & Pandas の方が楽かもしれない。

In [4]: df.pivot_table(
    values=[u'体重', u'身長'],
    rows=u'性別',
    aggfunc=pd.np.mean)
Out[4]:
      体重     身長
性別
女   51.5  161.575.0  177.0

aggfunc には任意の関数やラムダ式を渡せる。上の pd.np.mean は、 pandas をインポートすると numpy も含まれるので、numpy.mean を利用していることになる。aggfunc を省略すると、pd.np.mean が使われるので、上の例では実は aggfunc 省略可能。

3. 基本統計量

DataFrame の describe() を呼び出すと、基本的な統計量が表示される。

In [6]: df.describe()
Out[6]:
              体重          身長
count   4.000000    4.000000
mean   63.250000  169.250000
std    13.961256    9.742518
min    51.000000  159.000000
25%    51.750000  162.750000
50%    61.500000  168.500000
75%    73.000000  175.000000
max    79.000000  181.000000

上から、個数、平均値、標準偏差、最小値、第 1 四分位数、第 2 四分位数、第 3 四分位数、最大値となる。

4. group by

SQL を活用していると、 group by がとても便利だったりするが、DataFrame でも便利に使える。上の統計量を性別毎に分けるとすると、こうなる。

In [7]: df.groupby(u'性別').describe()
Out[7]:
                 体重          身長
性別
女  count   2.000000    2.000000
   mean   51.500000  161.500000
   std     0.707107    3.535534
   min    51.000000  159.000000
   25%    51.250000  160.250000
   50%    51.500000  161.500000
   75%    51.750000  162.750000
   max    52.000000  164.000000
男  count   2.000000    2.000000
   mean   75.000000  177.000000
   std     5.656854    5.656854
   min    71.000000  173.000000
   25%    73.000000  175.000000
   50%    75.000000  177.000000
   75%    77.000000  179.000000
   max    79.000000  181.000000

今回はこんなところで。