Skip to content
トピック
Pandas
Pandas Merge:PythonでDataFrameを結合する完全ガイド

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必須
right2番目の(右側の)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

onleft_onright_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        Sales

dept_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    Marketing

Diana(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    Marketing

Dianaが含まれるようになりましたが、彼女の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        Sales

Diana(一致する部門なし)と営業(一致する従業員なし)の両方が結果に表示されます。

外部結合を使用する場合: 両方のデータセットの完全な全体像が必要で、どの行が一致に失敗したかを識別したい場合に使用します。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の複合キーに相当します。行を結合するには、yearquarterの両方が一致する必要があります。

異なる列名での結合

2つのDataFrameが同じ概念に異なる名前を使用する場合があります。onの代わりにleft_onright_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    NaN

customer_ididの両方の列が結果に表示されることに注意してください。後で重複を削除できます:

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           80

Indicatorパラメータの使用

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)のようなツールを使用すると、チャートコードを書かずに視覚的に結果を探索でき、分析ワークフロー全体がより速く、より直感的になります。

📚