pandas によるデータセットのマージ

More than 5 years have passed since last update.


pandas の最新バージョン 0.14.0

pandas の最新版 0.14.0 が 5/30 にリリースされました。旧バージョンである 0.13.1 からアップグレードするには以下のコマンドを投入します。

pip install --upgrade pandas 


データセットのマージ

pandas がデータフレームというオブジェクトを提供する高水準で強力な分析ライブラリであることは以前にも紹介したばかりですが、これを利用して RDBMS のように複数のデータセットを結合することができます。


実際のデータセットから試す

pandas の read_json 関数は JSON をそのままデータフレームとして扱うことができます。ここではオープンソースプロジェクトである House API Project の API を利用してみます。ここではセンサーを利用して Wifi クライアント接続数や温度といった情報がオープンデータとして公開されています。これをマージしてみましょう。

import pandas as pd

# 1F の Wifi の接続数を最新 100 件取得する
wifi = pd.read_json('http://house-api-project.org/api/shibuhouse/wifi/clients?limit=100house-api-project.org/api/shibuhouse/wifi/1f/clients?limit=100')

# 1F の温度を最新 100 件取得する
temp = pd.read_json('http://house-api-project.org/api/shibuhouse/1f/temperature?limit=100')

print( wifi.head(5) )
#=>
# _id clients time
# 0 {'$oid': '538c3799c3ca7c08531d645e'} 21 2014-06-02 08:36:36 UTC
# 1 {'$oid': '538c3760c3ca7c08531d6454'} 21 2014-06-02 08:35:37 UTC
# 2 {'$oid': '538c371fc3ca7c08531d6445'} 21 2014-06-02 08:34:36 UTC
# 3 {'$oid': '538c36e4c3ca7c08531d643b'} 21 2014-06-02 08:33:37 UTC
# 4 {'$oid': '538c36a7c3ca7c08531d642f'} 21 2014-06-02 08:32:36 UTC

print( temp.head(5) )
#=>
# _id temperature time
# 0 {'$oid': '538c37cac3ca7c08531d6465'} 34.000 2014-06-02 08:37:29 UTC
# 1 {'$oid': '538c378dc3ca7c08531d6459'} 34.000 2014-06-02 08:36:29 UTC
# 2 {'$oid': '538c3752c3ca7c08531d644d'} 34.000 2014-06-02 08:35:29 UTC
# 3 {'$oid': '538c3715c3ca7c08531d6442'} 34.000 2014-06-02 08:34:29 UTC
# 4 {'$oid': '538c36dbc3ca7c08531d6437'} 34.000 2014-06-02 08:33:30 UTC

# ふたつのデータセットをインデックスでマージする
merged = pd.merge(wifi, temp, left_index=True, right_index=True)


マージのための様々なオプション

よく利用する引数は下表の通りです。

引数
説明

left
左側にマージをする

right
右側にマージをする

how
どのようにジョインするか (inner, outer, left, right)

on
マージに使う列名、明示的に指定したいときに

left_on/right_on
結合キーとして用いる別名

left_index/right_index
インデックスでマージしたいときに


データセットの連結

concat 関数はデータセットの連結をします。マージと似ていてわかりづらいのですが、詳細はドキュメントを読むのが良いでしょう。

Merge, join, and concatenate

http://pandas.pydata.org/pandas-docs/stable/merging.html

先ほどの JSON API の例で言うとこうなります。

concat = pd.concat([wifi, temp], ignore_index=True, axis=1)

concat.head(10)
#=>
# 0 1 2 \
# 0 {'$oid': '538c4081c3ca7c08531d6616'} 20 2014-06-02 09:14:37 UTC
# 1 {'$oid': '538c4045c3ca7c08531d660a'} 20 2014-06-02 09:13:37 UTC
# 2 {'$oid': '538c4005c3ca7c08531d65fb'} 20 2014-06-02 09:12:37 UTC
# 3 {'$oid': '538c3fcac3ca7c08531d65ef'} 20 2014-06-02 09:11:37 UTC
# 4 {'$oid': '538c3f8ec3ca7c08531d65e4'} 20 2014-06-02 09:10:36 UTC
# 5 {'$oid': '538c3f51c3ca7c08531d65d8'} 20 2014-06-02 09:09:36 UTC
# 6 {'$oid': '538c3f17c3ca7c08531d65cf'} 20 2014-06-02 09:08:36 UTC
# 7 {'$oid': '538c3edbc3ca7c08531d65c2'} 20 2014-06-02 09:07:37 UTC
# 8 {'$oid': '538c3ea1c3ca7c08531d65b9'} 20 2014-06-02 09:06:36 UTC
# 9 {'$oid': '538c3e61c3ca7c08531d65a8'} 22 2014-06-02 09:05:37 UTC

# 3 4 5
# 0 {'$oid': '538c4077c3ca7c08531d6611'} 34.125 2014-06-02 09:14:30 UTC
# 1 {'$oid': '538c403ac3ca7c08531d6606'} 34.125 2014-06-02 09:13:30 UTC
# 2 {'$oid': '538c3fffc3ca7c08531d65fa'} 34.125 2014-06-02 09:12:30 UTC
# 3 {'$oid': '538c3fc4c3ca7c08531d65ee'} 34.125 2014-06-02 09:11:31 UTC
# 4 {'$oid': '538c3f86c3ca7c08531d65e2'} 34.125 2014-06-02 09:10:29 UTC
# 5 {'$oid': '538c3f49c3ca7c08531d65d7'} 34.125 2014-06-02 09:09:29 UTC
# 6 {'$oid': '538c3f0ec3ca7c08531d65cb'} 34.125 2014-06-02 09:08:29 UTC
# 7 {'$oid': '538c3ed1c3ca7c08531d65bf'} 34.125 2014-06-02 09:07:29 UTC
# 8 {'$oid': '538c3e96c3ca7c08531d65b3'} 34.125 2014-06-02 09:06:29 UTC
# 9 {'$oid': '538c3e5bc3ca7c08531d65a7'} 34.125 2014-06-02 09:05:30 UTC


連結のための様々なオプション

よく利用する引数は下表の通りです。

引数
説明

objs
連結する pandas オブジェクトをリスト等で指定

axis
行か列か

join
inner か outer か、既定は outer

keys
連結するデータセット同士で関連付ける値

ignore_index
連結する軸とは別に新たなインデックスを生成する


まとめ

pandas を利用すると外部のデータセットを容易にマージしたり連結できることがわかりました。たとえばここからプロッティングすることで散布図を描いたり、相関関係を調べたりと色々な分析の可能性が見えてきますね。