LoginSignup
27
31

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-02

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

27
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
31