Pandas join 徹底解説: インデックスを使ったデータ結合を極める!
Pandasで複数のデータフレームを結合する際、多くの方がmerge関数を思い浮かべるでしょう。しかし、特にインデックスをキーとしてデータフレームを結合したい場合に、よりシンプルで直感的に使えるのがPandasのDataFrameメソッド**join**です。
この記事では、Pandas joinの基本的な使い方から、SQLのJOIN操作との比較、そして効率的なインデックスベースのデータ結合のための応用テクニックまで、徹底的に解説します。
Pandas joinってどんなもの?
PandasのDataFrame.join()メソッドは、DataFrameのインデックスをキーとして、他のDataFrame(または複数のDataFrame)を結合するための機能です。これは、pd.merge(left_index=True, right_index=True)のショートカット版と考えることができ、特に時系列データや主キーがインデックスとして設定されているデータフレームの結合でその真価を発揮します。
joinでできること
インデックスベースの結合: DataFrameのインデックスを明示的な結合キーとして使用します。
効率的な結合: インデックスが既にソートされている場合など、
mergeよりも高速に結合できることがあります。多様な結合タイプ:
how引数で、left(左外部結合、デフォルト)、right(右外部結合)、inner(内部結合)、outer(完全外部結合)を指定できます。複数DataFrameの同時結合: 複数のDataFrameを一度に結合することが可能です。
なぜjoinを選ぶべきか?
mergeも強力な結合関数ですが、joinを使うことには以下のようなメリットがあります。
コードの簡潔性: インデックスをキーとする結合では、
mergeに比べてコードが非常に短く、読みやすくなります。直感的なインデックス操作: インデックスがすでにデータフレームの自然な結合キーとなっている場合に、その意図がコードに明確に現れます。
複数DataFrame結合の容易さ:
df1.join([df2, df3, df4])のように、複数のデータフレームを一度に結合できるため、コード量を削減できます。
joinを始めるための準備
1. ライブラリのインポートとデータの準備
joinを使うためには、Pandasライブラリをインポートし、結合したいデータがDataFrame形式で用意されている必要があります。
import pandas as pd
# サンプルデータフレーム1 (ユーザー基本情報)
df_users = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 22, 35]
}, index=['user_001', 'user_002', 'user_003', 'user_004']) # ユーザーIDをインデックスに
# サンプルデータフレーム2 (ユーザーの連絡先情報)
df_contact = pd.DataFrame({
'email': ['alice@example.com', 'charlie@example.com', 'eve@example.com'], # user_002, user_004の情報はない、eve@は新規
'phone': ['111-222', '333-444', '555-666']
}, index=['user_001', 'user_003', 'user_005']) # user_005はdf_usersにない
# サンプルデータフレーム3 (ユーザーの購買情報)
df_purchase = pd.DataFrame({
'last_purchase': ['2023-01-15', '2023-02-20'],
'total_spent': [5000, 8000]
}, index=['user_001', 'user_002'])
print("--- df_users (ユーザー基本情報) ---")
print(df_users)
print("\n")
print("--- df_contact (ユーザー連絡先情報) ---")
print(df_contact)
print("\n")
print("--- df_purchase (ユーザー購買情報) ---")
print(df_purchase)
print("\n")
joinの基本的な使い方
DataFrame.join()メソッドには、主に以下の引数を指定します。
other: 結合したいDataFrame、またはDataFrameのリスト。on:left(呼び出し元のDataFrame)のどの列を結合キーとして使うか。デフォルトはleftのインデックス。how: 結合タイプを指定('left'(デフォルト),'right','inner','outer')。lsuffix,rsuffix: 結合元で列名が重複する場合のサフィックス。
最小限のサンプルプログラム
例1: 左外部結合 (Left Join) – デフォルト
df_users(呼び出し元)のインデックスをキーとして、df_contactを結合します。df_usersのすべての行が保持され、df_contactに一致するインデックスがない場合はNaNで埋められます。
# df_usersにdf_contactを左結合
joined_left = df_users.join(df_contact)
print("--- 左外部結合 (デフォルト) ---")
print(joined_left)
print("\n")
例2: 内部結合 (Inner Join)
両方のデータフレームに共通するインデックスを持つ行だけを結合します。
# df_usersにdf_contactを内部結合
joined_inner = df_users.join(df_contact, how='inner')
print("--- 内部結合 ---")
print(joined_inner)
print("\n")
例3: 右外部結合 (Right Join)
other(df_contact)のインデックスのすべての行を保持し、df_usersから一致する行を結合します。
# df_usersにdf_contactを右結合
joined_right = df_users.join(df_contact, how='right')
print("--- 右外部結合 ---")
print(joined_right)
print("\n")
例4: 完全外部結合 (Full Outer Join)
両方のデータフレームのすべてのインデックスを結合します。一致しない部分はNaNで埋められます。
# df_usersにdf_contactを完全外部結合
joined_outer = df_users.join(df_contact, how='outer')
print("--- 完全外部結合 ---")
print(joined_outer)
print("\n")
joinの応用テクニック
1. 複数のDataFrameを一度に結合
joinは、複数のDataFrameのリストをother引数に渡すことで、一度に結合できます。これはmergeではできないjoinの大きな利点です。
# df_usersにdf_contactとdf_purchaseを同時に左結合
# 列名が重複する場合にsuffixesを指定して競合を避ける
joined_multi = df_users.join([df_contact, df_purchase], how='left', rsuffix='_info')
print("--- 複数DataFrameの同時結合 ---")
print(joined_multi)
print("\n")
この例では、rsuffix='_info'は不要ですが、もし結合する複数のDataFrameに同じ列名(例: value)があった場合、_infoのようなサフィックスが自動で付与され、衝突を回避します。
2. DataFrameの列をキーとして結合 (on引数)
joinはインデックスベースの結合が基本ですが、呼び出し元のDataFrameの特定の列をキーとして結合することもできます。これは、その列を一時的にインデックスとして使用するような挙動です。
# df_usersをリセットしてuser_idを列に戻す
df_users_col = df_users.reset_index().rename(columns={'index': 'user_id'})
print("--- df_users_col (user_idが列) ---")
print(df_users_col)
print("\n")
# df_users_colの'user_id'列をキーとして、df_contact(インデックスがキー)と結合
joined_on_column = df_users_col.join(df_contact, on='user_id', how='left')
print("--- 列をキーとした結合 (`on`引数) ---")
print(joined_on_column)
print("\n")
この操作は、実質的にpd.merge(df_users_col, df_contact, left_on='user_id', right_index=True, how='left')と同じです。
joinとmerge、concatの使い分け
Pandasには結合のための複数の強力な関数があり、それぞれ最適な利用シーンがあります。
DataFrame.join():インデックスをキーとする結合に最適。
呼び出し元DataFrameのインデックスが結合の主キーとなる場合に最も簡潔に書けます。
複数のDataFrameを一度に結合できる。
pd.merge():共通の列名(または異なる列名)をキーとする結合に最適。
SQLの
JOIN操作に最も直接的に対応しており、リレーショナルなデータ統合に非常に強力です。インデックスをキーとする結合も可能だが、その場合は
left_index=True,right_index=Trueを明示的に指定する必要がある。
pd.concat():単純な連結: 行方向(上下)または列方向(左右)に、データフレームを文字通り「結合」したい場合に最も適しています。
共通のキーがなくても結合可能で、列やインデックスの和集合・積集合を取ることができます。SQLの
UNION操作に近い。
簡単な使い分けの例:
join: 「ユーザーID(インデックス)をキーに、ユーザー情報に連絡先情報を追加する」merge: 「商品コード(列)をキーに、商品マスタと日次売上を結合する」concat: 「同じ構造の月ごとの売上データを上下に連結して年間のデータを作る」
まとめ
この記事では、Pandasでインデックスを使ったデータフレームの結合に特化した**DataFrame.join()**メソッドについて、その特徴、基本的な使い方(各種結合タイプ)、そして複数のDataFrameの同時結合や列をキーとした結合といった応用テクニックを徹底的に解説しました。
joinを適切に活用することで、特にインデックスが重要な意味を持つデータセットの結合作業を、簡潔かつ効率的に行えるようになります。あなたのPandasによるデータ操作ワークフローにjoinをぜひ取り入れてみてください!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

