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関数の使い方と、各結合パターンの違い・用途をしっかり理解できたはずです。実務や学習にぜひ役立ててください!
コメント