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_on と right_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_id と id の両方の列が残ります。不要な列は 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=True や right_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 は非常に柔軟な結合操作ができるので、データの前処理で重宝します。どの結合方法を使うかは、欠損値をどう扱いたいかによって決めてください。