【第12回】Pandasのmerge関数でデータフレームを結合する方法【完全解説】

Pandasでデータフレームを結合する方法

Pandasでデータフレームを結合する方法

Pythonのデータ分析ライブラリ「Pandas」には、データフレームを結合するための便利な機能が備わっています。その中でも、`pd.merge`関数は、特定の列をキーとして複数のデータフレームを結合する際に非常に役立ちます。

この記事では、`pd.merge`関数を使って、2つのデータフレームを結合する様々な方法を分かりやすく解説していきます。 結合方法には、内部結合、左外部結合、右外部結合、完全外部結合の4パターンがあり、それぞれ異なる結果が得られます。具体的な例を見ながら、それぞれの結合方法の特徴を理解していきましょう。

▶️ concatの公式ドキュメントも参考にしてください:
pandas DataFrame merge Documentation

なぜmergeが必要なのか?

現実のデータ分析では、1つの表(データフレーム)だけで完結することは少なく、複数のデータを組み合わせて扱う場面がよくあります。 たとえば、社員の基本情報と給与情報が別々のデータフレームで管理されている場合、それらを統合して「誰がどこで働き、いくらもらっているのか」といった情報を得る必要があります。

Pandasのmerge()関数は、SQLのJOIN操作と同様に、複数のデータフレームをキーに基づいて柔軟に結合できる強力なツールです。 データを分析・可視化・機械学習などの処理にかける前段階として、「正しく結合する」ことは非常に重要なプロセスなのです。

concatとmergeの違いは?

Pandasには複数のデータフレームを結合する手段として、concat()merge()などがあります。 どちらもデータを統合する目的で使われますが、使い方や用途が大きく異なります。

関数用途結合方法
concat() 単純な縦方向または横方向の連結 インデックスやカラムの位置を基準に結合
merge() 共通のキーに基づいてマッチして統合 SQLのJOINと同じような挙動

今回のように、2つの表に共通するキー(この例ではName列)を元に情報を統合したい場合は、merge()の方が適しています。 一方、単に行や列を並べたいだけなら、concat()がシンプルで便利です。

サンプルデータの作成

まずは、結合に使用する2つのデータフレームを作成します。これらのデータフレームは、それぞれ社員の基本情報と年収、勤務地などの情報を表しています。

データフレーム1:社員の基本情報


import pandas as pd

df1 = pd.DataFrame(
    {"Name": ["Taro", "Hanako", "Jiro"],
     "Age": [23, 29, 35],
     "Occupation": ["Engineer", "Designer", "Teacher"],}
)
df1
    
Name Age Occupation
0 Taro 23 Engineer
1 Hanako 29 Designer
2 Jiro 35 Teacher

データフレーム2:社員の年収、勤務地など


df2 = pd.DataFrame(
   {"Name":  ["Taro","Jiro"],
    "Annual Income": [4500000,4900000],
    "Location": ["Tokyo","Nagoya"],
    "Years Employed": [2,10],
    "Index_number":[0,2]}
)
df2
    
Name Annual Income Location Years Employed Index_number
0 Taro 4500000 Tokyo 2 0
1 Jiro 4900000 Nagoya 10 2

データフレームの結合

それでは、作成した2つのデータフレームを`pd.merge`関数を使って結合してみましょう。結合方法は、`how`引数で指定します。

内部結合

内部結合では、両方のデータフレームに共通するキーを持つ行だけが結合されます。キーとして指定されていない列は、そのまま結合後のデータフレームに引き継がれます。


# 'Name'列をキーとして内部結合
df3 = pd.merge(df1, df2, on="Name")
df3
    
Name Age Occupation Annual Income Location Years Employed Index_number
0 Taro 23 Engineer 4500000 Tokyo 2 0
1 Jiro 35 Teacher 4900000 Nagoya 10 2

上記のコードでは、`on=”Name”`と指定することで、’Name’列をキーとして内部結合を行っています。つまり、’Name’列の値が両方のデータフレームに存在する行だけが結合されます。Hanakoさんの情報は、df2に存在しないため、結合後のデータフレームには含まれません。

左外部結合

左外部結合では、左側のデータフレームの全ての行と、右側のデータフレームでキーが一致する行が結合されます。右側のデータフレームにキーが一致する行がない場合は、対応する列にNaNが代入されます。


# 左外部結合
pd.merge(df1, df2, how='left', on='Name')
    
Name Age Occupation Annual Income Location Years Employed Index_number
0 Taro 23 Engineer 4500000 Tokyo 2 0
1 Hanako 29 Designer NaN NaN NaN NaN
2 Jiro 35 Teacher 4900000 Nagoya 10 2

上記のコードでは、`how=’left’`と指定することで、左外部結合を行っています。df1の全ての行が結果に含まれ、df2にキー(‘Name’)が一致する行がない場合は、対応する列にNaNが代入されます。Hanakoさんの情報は、df2に存在しないため、年収、勤務地などの情報はNaNになります。

右外部結合

右外部結合は、左外部結合の逆で、右側のデータフレームの全ての行と、左側のデータフレームでキーが一致する行が結合されます。左側のデータフレームにキーが一致する行がない場合は、対応する列にNaNが代入されます。


# 右外部結合
pd.merge(df1, df2, how='right', on='Name')
    
Name Age Occupation Annual Income Location Years Employed Index_number
0 Taro 23 Engineer 4500000 Tokyo 2 0
1 Jiro 35 Teacher 4900000 Nagoya 10 2

上記のコードでは、`how=’right’`と指定することで、右外部結合を行っています。df2の全ての行が結果に含まれ、df1にキー(‘Name’)が一致する行がない場合は、対応する列にNaNが代入されます。今回は、df1とdf2の’Name’列の値が全て一致しているため、左外部結合と同じ結果になります。

完全外部結合

完全外部結合では、両方のデータフレームの全ての行が結合されます。どちらかのデータフレームにキーが一致する行がない場合は、対応する列にNaNが代入されます。


# 完全外部結合
pd.merge(df1, df2, how='outer', on='Name')
    
Name Age Occupation Annual Income Location Years Employed Index_number
0 Hanako 29 Designer NaN NaN NaN NaN
1 Jiro 35 Teacher 4900000 Nagoya 10 2
2 Taro 23 Engineer 4500000 Tokyo 2 0

上記のコードでは、`how=’outer’`と指定することで、完全外部結合を行っています。df1とdf2の全ての行が結果に含まれ、どちらかのデータフレームにキー(‘Name’)が一致する行がない場合は、対応する列にNaNが代入されます。Hanakoさんの情報は、df2に存在しないため、年収、勤務地などの情報はNaNになります。また、df2にのみ存在する情報は、df1側の情報がNaNになります。

まとめ

  • Pandasのmerge()関数は、SQLのJOINに似た仕組みで複数のデータフレームをキーに基づいて結合できます。
  • 主な結合方法はhow引数で指定し、'inner''left''right''outer'の4種類があります。
  • 内部結合は共通するキーのみを結合、外部結合は片方または両方のデータをすべて保持します。
  • concat()との違いは、「単純な縦横連結」か「キーに基づくマッチング」かという点にあります。
  • 結合後にNaNが発生するケースもあるため、必要に応じてfillna()dropna()での後処理を検討しましょう。

この記事を通じて、merge関数の使い方と、各結合パターンの違い・用途をしっかり理解できたはずです。実務や学習にぜひ役立ててください!

▲ ページトップへ戻る

コメント

タイトルとURLをコピーしました