Pandas merge 徹底解説: 複数データフレームを効率的に結合!


 

データ分析において、複数のソースから得られたデータを組み合わせて分析することは日常茶飯事です。PandasのDataFrameを扱う上で、異なるデータフレームを結合する際に最も強力で柔軟な機能が**merge**メソッドです。

この記事では、Pandas mergeの基本的な使い方から、SQLのJOIN操作に対応するさまざまな結合タイプ、そして効率的なデータ結合のための応用テクニックまで、徹底的に解説します。


 

Pandas mergeってどんなもの?

 

Pandasのmergeメソッドは、SQLのリレーショナルデータベースにおけるJOIN操作に相当する機能を提供します。2つ以上のDataFrameを、共通の列(キー)に基づいて結合し、新しいDataFrameを作成します。これにより、異なるデータセットに散らばっている情報を統合し、より包括的な分析を可能にします。

 

mergeでできること

 

  • 内部結合 (Inner Join): 両方のデータフレームに共通するキーを持つ行だけを結合します。

  • 左外部結合 (Left Join): 左側のデータフレームのすべての行を保持し、右側のデータフレームから一致する行を結合します。一致しない場合はNaNで埋められます。

  • 右外部結合 (Right Join): 右側のデータフレームのすべての行を保持し、左側のデータフレームから一致する行を結合します。一致しない場合はNaNで埋められます。

  • 完全外部結合 (Full Outer Join): 両方のデータフレームのすべての行を結合します。一致しない場合はNaNで埋められます。

  • 複数のキーでの結合: 複数の列をキーとして指定し、より複雑な結合条件を設定できます。


 

なぜmergeを選ぶべきか?

 

データフレームの結合にはconcatjoinといったメソッドもありますが、特にリレーショナルな結合を行う場合にmergeを選ぶメリットは大きいです。

  • SQLライクな操作: SQLのJOINに慣れている方にとっては直感的で理解しやすく、スムーズにPandasでの結合に移行できます。

  • 柔軟な結合タイプ: 内部結合、外部結合など、様々な結合タイプをhow引数一つで切り替えられるため、データの要件に応じた結合が容易です。

  • 複数キーのサポート: 複数の列を結合キーとして指定できるため、複雑な結合条件にも対応できます。

  • 効率的な処理: 大規模なデータセットでも効率的に動作するように設計されています。


 

mergeを始めるための準備

 

 

1. ライブラリのインポートとデータの準備

 

mergeを使うためには、Pandasライブラリをインポートし、結合したいデータがDataFrame形式で用意されている必要があります。

Python
 
import pandas as pd

# サンプルデータフレーム1 (ユーザー情報)
df_users = pd.DataFrame({
    'user_id': [1, 2, 3, 4, 5],
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'city': ['Tokyo', 'Osaka', 'Tokyo', 'Nagoya', 'Kyoto']
})

# サンプルデータフレーム2 (注文情報)
df_orders = pd.DataFrame({
    'order_id': [101, 102, 103, 104, 105, 106],
    'user_id': [1, 3, 2, 6, 1, 4], # user_id=6はdf_usersに存在しない
    'product': ['A', 'B', 'C', 'A', 'D', 'B'],
    'price': [1000, 1500, 500, 2000, 1200, 800]
})

print("--- df_users (ユーザー情報) ---")
print(df_users)
print("\n")

print("--- df_orders (注文情報) ---")
print(df_orders)
print("\n")

 

mergeの基本的な使い方

 

merge関数には、主に以下の引数を指定します。

  • left, right: 結合したい2つのDataFrame。

  • on: 結合のキーとなる列名(共通の列名の場合)。リストで複数指定も可能。

  • left_on, right_on: 左右のDataFrameで結合キーの列名が異なる場合。

  • how: 結合タイプを指定('inner', 'left', 'right', 'outer')。デフォルトは'inner'

 

最小限のサンプルプログラム

 

 

例1: 内部結合 (Inner Join) – デフォルト

 

両方のデータフレームに共通するuser_idを持つ行だけを結合します。user_id=6の注文は含まれません。

Python
 
# 'user_id'をキーとして内部結合
merged_inner = pd.merge(df_users, df_orders, on='user_id', how='inner')
print("--- 内部結合 (Inner Join) ---")
print(merged_inner)
print("\n")

 

例2: 左外部結合 (Left Join)

 

左側のdf_usersのすべての行を保持し、df_ordersから一致する行を結合します。user_id=6の注文は結合されませんが、df_usersのすべてのユーザーは残ります。

Python
 
# 'user_id'をキーとして左外部結合
merged_left = pd.merge(df_users, df_orders, on='user_id', how='left')
print("--- 左外部結合 (Left Join) ---")
print(merged_left)
print("\n")

 

例3: 右外部結合 (Right Join)

 

右側のdf_ordersのすべての行を保持し、df_usersから一致する行を結合します。user_id=6の注文情報も含まれ、対応するユーザー情報(name, city)はNaNになります。

Python
 
# 'user_id'をキーとして右外部結合
merged_right = pd.merge(df_users, df_orders, on='user_id', how='right')
print("--- 右外部結合 (Right Join) ---")
print(merged_right)
print("\n")

 

例4: 完全外部結合 (Full Outer Join)

 

両方のデータフレームのすべての行を結合します。一致しない部分はNaNで埋められます。

Python
 
# 'user_id'をキーとして完全外部結合
merged_outer = pd.merge(df_users, df_orders, on='user_id', how='outer')
print("--- 完全外部結合 (Full Outer Join) ---")
print(merged_outer)
print("\n")

 

mergeの応用テクニック

 

 

1. 結合キーの列名が異なる場合 (left_on, right_on)

 

左右のDataFrameで結合キーの列名が異なる場合は、left_onright_onを使います。

Python
 
df_employees = pd.DataFrame({
    'employee_id': [101, 102, 103],
    'name': ['John', 'Jane', 'Mike']
})

df_projects = pd.DataFrame({
    'project_name': ['Alpha', 'Beta', 'Gamma'],
    'leader_id': [101, 103, 105] # 105はdf_employeesに存在しない
})

# employee_id と leader_id で結合 (左結合)
merged_diff_keys = pd.merge(df_employees, df_projects, left_on='employee_id', right_on='leader_id', how='left')
print("--- 異なるキー名での結合 ---")
print(merged_diff_keys)
print("\n")

 

2. 複数のキーでの結合

 

複数の列を結合キーとして指定するには、onまたはleft_on/right_onに列名のリストを渡します。

Python
 
df_sales_a = pd.DataFrame({
    'date': ['2023-01-01', '2023-01-01', '2023-01-02'],
    'product': ['A', 'B', 'A'],
    'revenue_a': [100, 150, 120]
})

df_sales_b = pd.DataFrame({
    'date': ['2023-01-01', '2023-01-02', '2023-01-01'],
    'product': ['A', 'A', 'C'], # product Cはdf_sales_aにない
    'revenue_b': [50, 80, 70]
})

# 'date'と'product'を両方のキーとして結合
merged_multi_keys = pd.merge(df_sales_a, df_sales_b, on=['date', 'product'], how='outer')
print("--- 複数キーでの結合 ---")
print(merged_multi_keys)
print("\n")

 

3. 重複する列名の解決 (suffixes)

 

結合元のDataFrameに同じ列名が存在し、それが結合キーでない場合、_x_yというサフィックスが自動的に付与されます。これを変更するにはsuffixes引数を使用します。

Python
 
df_data1 = pd.DataFrame({'id': [1,2], 'value': [10,20]})
df_data2 = pd.DataFrame({'id': [1,3], 'value': [15,25]})

merged_suffix = pd.merge(df_data1, df_data2, on='id', suffixes=('_data1', '_data2'))
print("--- 重複列名の解決 (`suffixes`) ---")
print(merged_suffix)
print("\n")

 

まとめ

 

この記事では、Pandasで複数のデータフレームを効率的に結合するための強力なメソッドmergeについて、その特徴、SQLのJOINに対応する各結合タイプの使い方、そして異なるキー名での結合や複数キーでの結合といった応用テクニックまでを徹底的に解説しました。

mergeを使いこなすことで、複雑なデータ統合のタスクをPythonコードで簡潔かつ効率的に実行できるようになります。あなたのデータ分析ワークフローにおいてmergeは欠かせないツールとなるでしょう。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座