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爆速講座