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を選ぶべきか?
データフレームの結合にはconcatやjoinといったメソッドもありますが、特にリレーショナルな結合を行う場合にmergeを選ぶメリットは大きいです。
-
SQLライクな操作: SQLのJOINに慣れている方にとっては直感的で理解しやすく、スムーズにPandasでの結合に移行できます。
-
柔軟な結合タイプ: 内部結合、外部結合など、様々な結合タイプを
how引数一つで切り替えられるため、データの要件に応じた結合が容易です。 -
複数キーのサポート: 複数の列を結合キーとして指定できるため、複雑な結合条件にも対応できます。
-
効率的な処理: 大規模なデータセットでも効率的に動作するように設計されています。
mergeを始めるための準備
1. ライブラリのインポートとデータの準備
mergeを使うためには、Pandasライブラリをインポートし、結合したいデータがDataFrame形式で用意されている必要があります。
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の注文は含まれません。
# '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のすべてのユーザーは残ります。
# '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になります。
# '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で埋められます。
# '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_onとright_onを使います。
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に列名のリストを渡します。
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引数を使用します。
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爆速講座

