pandas の merge でデータフレームを結合する(inner / left / right / outer)

pandas でデータ分析をしていると、複数のデータフレームを結合したい場面がよくあります。merge 関数を使えば、SQL の JOIN と同じような操作ができます。

基本的な使い方

merge はキーとなる列を基準に、2 つのデータフレームを結合します。

import pandas as pd

df1 = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

df2 = pd.DataFrame({
    'id': [2, 3, 4],
    'score': [80, 90, 70]
})

result = pd.merge(df1, df2, on='id')
print(result)

このコードを実行すると、id が一致する行だけが結合されます。デフォルトでは inner join(内部結合)になるため、両方に存在する id=2 と id=3 の行だけが残ります。

4 種類の結合方法

how パラメータで結合方法を指定できます。

結合方法説明
inner両方に存在するキーのみ
left左のデータフレームを基準
right右のデータフレームを基準
outerどちらかに存在するキー全て

それぞれの動作を見てみましょう。

# inner join(デフォルト)
pd.merge(df1, df2, on='id', how='inner')

# left join
pd.merge(df1, df2, on='id', how='left')

# right join
pd.merge(df1, df2, on='id', how='right')

# outer join
pd.merge(df1, df2, on='id', how='outer')

left join では df1 の全行が保持され、df2 に対応がない部分は NaN になります。outer join では両方の全行が保持されるため、id が 1〜4 の 4 行になります。

キー列の名前が異なる場合

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

df1 = pd.DataFrame({
    'user_id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

df2 = pd.DataFrame({
    'id': [2, 3, 4],
    'score': [80, 90, 70]
})

result = pd.merge(df1, df2, left_on='user_id', right_on='id')

この場合、結果には user_idid の両方の列が残ります。不要な列は drop で削除してください。

複数のキーで結合する

複数の列をキーにする場合は、リストで指定します。

df1 = pd.DataFrame({
    'year': [2023, 2023, 2024],
    'month': [1, 2, 1],
    'sales': [100, 200, 150]
})

df2 = pd.DataFrame({
    'year': [2023, 2024],
    'month': [1, 1],
    'target': [120, 180]
})

result = pd.merge(df1, df2, on=['year', 'month'])

year と month の両方が一致する行だけが結合されます。

インデックスをキーにする

インデックスを結合キーにしたい場合は、left_index=Trueright_index=True を指定します。

df1 = pd.DataFrame({'name': ['Alice', 'Bob']}, index=[1, 2])
df2 = pd.DataFrame({'score': [80, 90]}, index=[2, 3])

result = pd.merge(df1, df2, left_index=True, right_index=True, how='outer')

merge は非常に柔軟な結合操作ができるので、データの前処理で重宝します。どの結合方法を使うかは、欠損値をどう扱いたいかによって決めてください。