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

Advent Calendar 2013 - 3

Python で解析! - DataFrame - 2

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

1. ファイルの読み込み

ファイルを読み込む方法は次の通り。

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 を用意する。今回は日本語を使ってみる。

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

Excel で活用している人が多いと思われるピボットテーブルだが、エンジニアにとっては Python & Pandas の方が楽かもしれない。

df.pivot_table(
   values=[u'体重', u'身長'],
   rows=u'性別',
   aggfunc=pd.np.mean)
      体重     身長
性別
   51.5  161.5
   75.0  177.0

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

3. 基本統計量

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

df.describe()
              体重          身長
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 でも便利に使える。上の統計量を性別毎に分けるとすると、こうなる。

df.groupby(u'性別').describe()
                 体重          身長
性別
  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

今回はこんなところで。