Pandas Merge:PythonでDataFrameを結合する完全ガイド
Updated on
単一のDataFrameで作業することは、現実世界ではまれです。ほとんどのデータ分析プロジェクトでは、複数のソースからのデータを結合する必要があります——販売記録と顧客プロファイル、センサー測定値とデバイスメタデータ、またはアンケート回答と人口統計テーブルなど。pandas merge関数は、Python開発者がDataFrameを結合するために使用する標準ツールであり、これをよく理解することが、データ準備に数分または数時間かかる違いになります。
このガイドでは、pd.merge()のあらゆる側面をカバーします:4つの主要な結合タイプ、複数の列での結合、重複名の処理、および一般的な落とし穴。すべての例は、ノートブックに直接コピーできる実行可能なコードを使用しています。
pd.merge()の機能
pd.merge()は、1つ以上の共有列(キーと呼ばれる)に基づいて行を照合することにより、2つのDataFrameを結合します。これはSQL JOINステートメントのように機能します。照合する列と実行する結合のタイプを選択すると、pandasが残りを処理します。
基本的な構文は次のとおりです:
import pandas as pd
result = pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
suffixes=('_x', '_y'), indicator=False, validate=None)主要パラメータリファレンス
| パラメータ | 説明 | デフォルト |
|---|---|---|
left | 最初の(左側の)DataFrame | 必須 |
right | 2番目の(右側の)DataFrame | 必須 |
how | 結合タイプ:'inner'、'left'、'right'、'outer'、'cross' | 'inner' |
on | 結合する列名(両方のDataFrameに存在する必要があります) | None |
left_on | キーとして使用する左側DataFrameの列 | None |
right_on | キーとして使用する右側DataFrameの列 | None |
left_index | 結合キーとして左側DataFrameのインデックスを使用 | False |
right_index | 結合キーとして右側DataFrameのインデックスを使用 | False |
suffixes | 重複する列名に適用するサフィックス | ('_x', '_y') |
indicator | 各行のソースを示す列を追加 | False |
validate | 結合が1対1、1対多などであるかをチェック | None |
on、left_on、right_onを省略すると、pandasは両方のDataFrameで同じ名前を共有するすべての列で自動的に結合します。
すべての例のサンプルデータ
以下のすべての例では、これら2つのDataFrameを使用します:
import pandas as pd
employees = pd.DataFrame({
'emp_id': [1, 2, 3, 4, 5],
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'dept_id': [10, 20, 10, 30, 20]
})
departments = pd.DataFrame({
'dept_id': [10, 20, 40],
'dept_name': ['Engineering', 'Marketing', 'Sales']
})
print(employees)
print(departments)出力:
emp_id name dept_id
0 1 Alice 10
1 2 Bob 20
2 3 Charlie 10
3 4 Diana 30
4 5 Eve 20
dept_id dept_name
0 10 Engineering
1 20 Marketing
2 40 Salesdept_id 30はemployeesにのみ存在し、dept_id 40はdepartmentsにのみ存在することに注意してください。この不一致は意図的なものです——結合タイプ間の違いを明確にします。
内部結合(デフォルト)
内部結合は、キーが両方のDataFrameに存在する行のみを返します。一致しない行は削除されます。
inner_result = pd.merge(employees, departments, on='dept_id', how='inner')
print(inner_result)出力:
emp_id name dept_id dept_name
0 1 Alice 10 Engineering
1 3 Charlie 10 Engineering
2 2 Bob 20 Marketing
3 5 Eve 20 MarketingDiana(dept_id=30)は削除されます。これは、departmentsテーブルに部門30が存在しないためです。部門40(営業)も不在です。これは、それに属する従業員がいないためです。
内部結合を使用する場合: 完全なレコードのみが必要な場合に使用します——両側に有効なデータがある行。これは最も安全なデフォルトです。なぜなら、一致しない行からNaN値を導入することがないためです。
左結合
左結合は左側DataFrameのすべての行を保持し、右側の一致する行のみを保持します。一致がない場合、右側の列はNaNで埋められます。
left_result = pd.merge(employees, departments, on='dept_id', how='left')
print(left_result)出力:
emp_id name dept_id dept_name
0 1 Alice 10 Engineering
1 2 Bob 20 Marketing
2 3 Charlie 10 Engineering
3 4 Diana 30 NaN
4 5 Eve 20 MarketingDianaが含まれるようになりましたが、彼女のdept_nameはNaNです。これは、departmentsテーブルに部門30のエントリがないためです。
左結合を使用する場合: 左側のDataFrameが「プライマリ」データセットであり、プライマリテーブルから行を失うことなく追加の列でエンリッチしたい場合に使用します。これは実際に最も一般的な結合タイプです。
右結合
右結合は左結合の鏡像です。右側DataFrameのすべての行を保持し、左側の一致する行のみを保持します。
right_result = pd.merge(employees, departments, on='dept_id', how='right')
print(right_result)出力:
emp_id name dept_id dept_name
0 1.0 Alice 10 Engineering
1 3.0 Charlie 10 Engineering
2 2.0 Bob 20 Marketing
3 5.0 Eve 20 Marketing
4 NaN NaN 40 Sales営業部門(dept_id=40)が表示されるようになりましたが、それに属する従業員はいません。その行の従業員フィールドはNaNです。
右結合を使用する場合: 実際には、右結合はまれです。DataFrameの順序を入れ替えることで、右結合を常に左結合として書き直すことができます。ほとんどのコードベースは、一貫性のために左結合を好みます。
外部結合(完全外部結合)
外部結合は両方のDataFrameからすべての行を返します。一致がない場合、欠損値はNaNで埋められます。
outer_result = pd.merge(employees, departments, on='dept_id', how='outer')
print(outer_result)出力:
emp_id name dept_id dept_name
0 1.0 Alice 10 Engineering
1 3.0 Charlie 10 Engineering
2 2.0 Bob 20 Marketing
3 5.0 Eve 20 Marketing
4 4.0 Diana 30 NaN
5 NaN NaN 40 SalesDiana(一致する部門なし)と営業(一致する従業員なし)の両方が結果に表示されます。
外部結合を使用する場合: 両方のデータセットの完全な全体像が必要で、どの行が一致に失敗したかを識別したい場合に使用します。indicatorパラメータはここで特に役立ちます。
結合タイプのクイック比較
| 結合タイプ | 左側から保持 | 右側から保持 | 一致しない行 |
|---|---|---|---|
inner | 一致のみ | 一致のみ | 削除 |
left | すべての行 | 一致のみ | 左側の行を保持、右側はNaNで埋める |
right | 一致のみ | すべての行 | 右側の行を保持、左側はNaNで埋める |
outer | すべての行 | すべての行 | 両側を保持、一致なしの場所はNaN |
cross | すべての行 | すべての行 | デカルト積(すべての組み合わせ) |
複数の列での結合
単一の列では一致を一意に識別するのに十分でない場合、列名のリストをonに渡します:
sales = pd.DataFrame({
'year': [2024, 2024, 2025, 2025],
'quarter': ['Q1', 'Q2', 'Q1', 'Q2'],
'revenue': [100, 150, 200, 250]
})
targets = pd.DataFrame({
'year': [2024, 2024, 2025, 2025],
'quarter': ['Q1', 'Q2', 'Q1', 'Q2'],
'target': [120, 140, 210, 230]
})
merged = pd.merge(sales, targets, on=['year', 'quarter'])
print(merged)出力:
year quarter revenue target
0 2024 Q1 100 120
1 2024 Q2 150 140
2 2025 Q1 200 210
3 2025 Q2 250 230これはSQLの複合キーに相当します。行を結合するには、yearとquarterの両方が一致する必要があります。
異なる列名での結合
2つのDataFrameが同じ概念に異なる名前を使用する場合があります。onの代わりにleft_onとright_onを使用します:
orders = pd.DataFrame({
'order_id': [101, 102, 103],
'customer_id': [1, 2, 3],
'amount': [50.0, 75.0, 120.0]
})
customers = pd.DataFrame({
'id': [1, 2, 4],
'name': ['Alice', 'Bob', 'Diana']
})
merged = pd.merge(orders, customers, left_on='customer_id', right_on='id', how='left')
print(merged)出力:
order_id customer_id amount id name
0 101 1 50.0 1.0 Alice
1 102 2 75.0 2.0 Bob
2 103 3 120.0 NaN NaNcustomer_idとidの両方の列が結果に表示されることに注意してください。後で重複を削除できます:
merged = merged.drop(columns=['id'])サフィックスで重複する列名を処理
両方のDataFrameに同じ名前の列がある場合(キー以外)、pandasはそれらを区別するためにサフィックスを追加します:
df1 = pd.DataFrame({
'id': [1, 2, 3],
'score': [85, 90, 78]
})
df2 = pd.DataFrame({
'id': [1, 2, 3],
'score': [88, 92, 80]
})
# デフォルトのサフィックス
merged = pd.merge(df1, df2, on='id')
print(merged)出力:
id score_x score_y
0 1 85 88
1 2 90 92
2 3 78 80サフィックスをカスタマイズして、列名をより意味のあるものにすることができます:
merged = pd.merge(df1, df2, on='id', suffixes=('_midterm', '_final'))
print(merged)出力:
id score_midterm score_final
0 1 85 88
1 2 90 92
2 3 78 80Indicatorパラメータの使用
indicatorパラメータは、各行がどこから来たかを示す_merge列を追加します:
result = pd.merge(employees, departments, on='dept_id', how='outer', indicator=True)
print(result)出力:
emp_id name dept_id dept_name _merge
0 1.0 Alice 10 Engineering both
1 3.0 Charlie 10 Engineering both
2 2.0 Bob 20 Marketing both
3 5.0 Eve 20 Marketing both
4 4.0 Diana 30 NaN left_only
5 NaN NaN 40 Sales right_onlyこれはデータ品質チェックに非常に役立ちます——一致に失敗した行を素早くフィルタリングできます:
unmatched = result[result['_merge'] != 'both']
print(unmatched)merge()とjoin()とconcat()——それぞれを使用する場合
Pandasは、DataFrameを結合する3つの方法を提供します。それぞれを使用する場合は次のとおりです:
| 機能 | pd.merge() | df.join() | pd.concat() |
|---|---|---|---|
| 結合タイプ | 列ベース(SQLのような) | デフォルトでインデックスベース | 行または列をスタック |
| 構文 | pd.merge(df1, df2, on='col') | df1.join(df2, on='col') | pd.concat([df1, df2]) |
| 最適な用途 | 共有列での結合 | インデックスでの結合 | DataFrameを垂直/水平にスタック |
| 複数のキー | はい(on=['a','b']) | 限定的 | 該当なし |
| 複数のDataFrame | 一度に2つ | 一度に2つ | 一度に任意の数 |
| デフォルト結合 | 内部結合 | 左結合 | 外部結合(axis=0) |
| 柔軟性 | 最高 | 中程度 | 異なるユースケース |
経験則:
- 列の値に基づいてDataFrameを結合する場合は
pd.merge()を使用します(最も一般的なケース)。 - 結合キーがインデックスで、より短い構文が必要な場合は
df.join()を使用します。 - DataFrameを上下に重ねる(行を追加)場合、または並べて配置する場合は
pd.concat()を使用します。
一般的なエラーとトラブルシューティング
1. MergeError:列が重複していますが、サフィックスが指定されていません
両方のDataFrameに同じ名前の非キー列があり、suffixes=(False, False)を設定した場合に発生します:
# 修正:意味のあるサフィックスを使用
merged = pd.merge(df1, df2, on='id', suffixes=('_left', '_right'))2. 予期しない行の爆発(多対多結合)
両方のDataFrameの結合キーに重複値がある場合、pandasは一致する行のデカルト積を作成します。これにより、結果の行数がどちらの入力よりもはるかに多くなる可能性があります:
# 結合前に重複をチェック
print(df1['key'].duplicated().sum())
print(df2['key'].duplicated().sum())
# validateを使用して早期にキャッチ
merged = pd.merge(df1, df2, on='key', validate='one_to_many')validateパラメータは、'one_to_one'、'one_to_many'、'many_to_one'、および'many_to_many'を受け入れます。データが期待されるカーディナリティと一致しない場合、MergeErrorを発生させます。
3. キー列のデータ型が異なる
一方のDataFrameがキーをint64として保存し、もう一方がobject(文字列)として保存している場合、結合は失敗するか、ゼロ一致を生成します:
# データ型をチェック
print(df1['id'].dtype) # int64
print(df2['id'].dtype) # object
# 修正:同じ型にキャスト
df2['id'] = df2['id'].astype(int)
merged = pd.merge(df1, df2, on='id')4. キーのNaN値
結合キー列にNaNがある行は何も一致しません(pandasではNaN != NaN)。最初に削除または埋めます:
df1 = df1.dropna(subset=['key'])PyGWalkerで結合したDataFrameを可視化
データを結合した後、次のステップは通常、結果を探索することです——分布を調べ、パターンを見つけ、異常をチェックします。数十のmatplotlibまたはseabornの呼び出しを書く代わりに、PyGWalker (opens in a new tab)を使用できます。これは、任意のpandas DataFrameをJupyter Notebook内で直接、インタラクティブなTableauのような視覚的探索インターフェースに変換するオープンソースのPythonライブラリです。
import pandas as pd
import pygwalker as pyg
# DataFrameを結合
employees = pd.DataFrame({
'emp_id': [1, 2, 3, 4, 5],
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'dept_id': [10, 20, 10, 30, 20],
'salary': [95000, 82000, 105000, 78000, 91000]
})
departments = pd.DataFrame({
'dept_id': [10, 20, 30],
'dept_name': ['Engineering', 'Marketing', 'Design']
})
merged = pd.merge(employees, departments, on='dept_id')
# インタラクティブな可視化を起動——ドラッグアンドドロップで探索
walker = pyg.walk(merged)PyGWalkerを使用すると、dept_nameをx軸に、salaryをy軸にドラッグして、部門別の給与分布を即座に確認できます——チャートコードは不要です。フィールドをドラッグするだけで、棒グラフ、散布図、ヒストグラムなどを作成できます。特に、結合が期待どおりに機能したことを確認する必要がある複雑な結合の結果を探索する場合に強力です。
Google Colab (opens in a new tab)、Kaggle (opens in a new tab)で今すぐPyGWalkerを試すか、
pip install pygwalkerでインストールできます。
FAQ
pandas mergeとjoinの違いは何ですか?
pd.merge()はデフォルトで列の値に基づいてDataFrameを結合し、すべての結合タイプ(内部結合、左結合、右結合、外部結合、交差結合)をサポートします。df.join()はデフォルトでインデックスで結合し、左結合を使用します。内部的には、join()はmerge()を呼び出すため、同じ結果を生成します——merge()は単に一致する列をより細かく制御できます。
pandasで複数の列で2つのDataFrameを結合するにはどうすればよいですか?
列名のリストをonパラメータに渡します:pd.merge(df1, df2, on=['col_a', 'col_b'])。行を結合するには、両方の列が一致する必要があります。これはSQLの複合キーに相当します。
なぜpandas mergeは重複行を作成するのですか?
結合キーに一方または両方のDataFrameで重複値がある場合、重複行が表示されます。Pandasは一致するすべての行のデカルト積を作成します。結合前にdf.duplicated(subset=['key']).sum()を使用して重複をチェックするか、validate='one_to_one'を使用して早期にキャッチします。
pandasのクロス結合とは何ですか?
クロス結合(how='cross')は、両方のDataFrameのデカルト積を生成します——左側のすべての行が右側のすべての行とペアになります。左側に3行、右側に4行ある場合、結果は12行になります。すべての可能な組み合わせを生成するのに役立ちます。たとえば、すべての製品をすべての店舗の場所とペアリングする場合などです。
インデックスでpandas mergeを実行するにはどうすればよいですか?
left_index=Trueおよび/またはright_index=Trueを設定します:pd.merge(df1, df2, left_index=True, right_index=True)。インデックスと列キーを混在させることもできます:pd.merge(df1, df2, left_on='col_a', right_index=True)。
結論
pandas merge()関数は、Pythonで最も柔軟で広く使用されているDataFrameを結合するためのツールです。重要なポイントを要約すると:
- 内部結合(デフォルト)は、両方のDataFrameで一致する行のみを保持します。
- 左結合は、左側DataFrameのすべての行を保持し、右側が一致しない場所にNaNを埋めます。
- 右結合は、右側DataFrameのすべての行を保持します——ただし、一貫性のために順序を入れ替えた左結合を使用することをお勧めします。
- 外部結合は、両側のすべてを保持し、
indicator=Trueで一致しないレコードを識別するのに役立ちます。 - 同名キーには
onを使用し、異なる名前キーにはleft_on/right_onを使用し、重複する列を処理するにはsuffixesを使用します。 - 予期しない結果を避けるため、結合前に常に重複キーと一致しないデータ型をチェックします。
データが結合されたら、PyGWalker (opens in a new tab)のようなツールを使用すると、チャートコードを書かずに視覚的に結果を探索でき、分析ワークフロー全体がより速く、より直感的になります。