Python で解析 17

“Advent Calendar 2013 - Python で解析!” の十七日目。DataFrame - 12

今回は DataFrame の演算を取り上げる。データは円単位だが表示はドルで行いたいとか、タイムゾーンを変換したい…などのシチュエーションが考えられる。

1. データの準備

では、いつもの通りのデータの準備を。

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({
   ...:   'height': [162, 178, 167, 171, 170],
   ...:   'weight1': [51, 80, 55, 68, 71],
   ...:   'weight2': [53, 75, 51, 68, 73]
   ...: })

In [3]: df
Out[3]:
   height  weight1  weight2
0     162       51       53
1     178       80       75
2     167       55       51
3     171       68       68
4     170       71       73

2. 一括演算

リストやタプルだと、ループなり、リスト内包表記なり…で、計算することになる。

In [4]: cm = [162, 178, 167, 171, 170]

In [5]: inch = [it * 0.39 for it in cm]

In [6]: inch
Out[6]: [63.18, 69.42, 65.13, 66.69, 66.3]

これでも十分に簡単な気もするが、Pandas を使う場合ともっと簡単に書ける。

In [7]: df.height * 0.39
Out[7]:
0    63.18
1    69.42
2    65.13
3    66.69
4    66.30
Name: height, dtype: float64

R などの統計処理系を使い慣れている人には当たり前のことだが、一般のアプリケーションプログラマーの中には、カルチャーショックを感じる人もいるかもしれない。

3. 集合と集合の演算

サンプルの weight1 と weight2 は、ダイエット前後の体重だとして、簡単な式でダイエットの成果を算出できてしまう。

In [8]: df.weight2 - df.weight1
Out[8]:
0    2
1   -5
2   -4
3    0
4    2
dtype: int64

4. 混在した演算

肥満かどうかの判断基準として、身長から 110 を引いた体重を目安とするというのがあるが、その基準体重と比べるとしたら、こういう式で書ける。

In [9]: df.weight2 - (df.height - 110)
Out[9]:
0     1
1     7
2    -6
3     7
4    13
dtype: int64

2 番が痩せ気味、4 番が肥満気味なサンプルデータだったが、それはともかく…。これはなかなか便利で、統計処理を使わない通常のプログラミングでも Pandas を使いたくなるかもしれない。

今回はこんなところで。