Pandasでデータフレーム同士を結合したい場面は少なくないと思います。データフレームを結合するといっても、その方法は様々です。
データフレームを結合するときは、merge()またはjoin()を使います。
この記事では、
- merge()の使い方がわかる
- join()の使い方がわかる
といったことができるようになることを目標にします。
記事内のコードを丸写しして実行できるので、是非実際に手を動かしてみてください!
今回のデータ
今回は、3つのデータフレーム(df1, df2, df3)を用います。
データの区切りは適当で、特に意味はありません。
import pandas as pd
from sklearn.datasets import load_boston
data = load_boston()
df = pd.DataFrame(data.data, columns=data.feature_names)
df1 = df.iloc[:5, :3]
df2 = df.loc[:4, ["CRIM", "CHAS", "NOX"]]
df3 = df.iloc[6:11, :3]
df1
df2
df3
merge()を使う
データの列名に従ってデータを結合する場合には、merge()を使います。
merge()には
- pandas.merge()
- DataFrame.merge()
の2種類存在します。
基本的にはどちらを使ってもOKです^^
自分で使いやすいほうを使ってください。
では、実際に例を見てみましょう。
pandas.merge()
pandas.merge() (以後、pd.merge())では、leftに相当するデータフレームを第1引数、rightに相当するデータフレームを第2引数に指定します。
pd.merge(df1, df2)
“CRIM”列をキーとして、2つのデータフレームを結合できました。
DataFrame.merge()
この方法では、leftに相当するデータフレームからmerge()メソッドを呼び出し、第1引数にrightに相当するデータフレームを指定します。
df1.merge(df2)
pd.merge()と同じようにデータフレームの結合ができました。
ただし、可読性を向上させるために、同一プログラム内では統一すると良いと思います。
以降は、pd.merge()とDataFrame.merge()で共通の引数を紹介します。
キー列を指定する(on, right_on, left_on)
結合する各データフレームのどの列をキーとするかを指定します。
df1.merge(df2, on="CRIM")
right_on, left_onで指定することで、それぞれのデータフレームごとにキー列を指定することもできます。
df4 = df2.rename(columns={"CRIM":"CRIM_1"})
#df4の中身
# CRIM_1 CHAS NOX
#0 0.00632 0.0 0.538
#1 0.02731 0.0 0.469
#2 0.02729 0.0 0.469
#3 0.03237 0.0 0.458
#4 0.06905 0.0 0.458
df1.merge(df4, right_on="CRIM_1", left_on="CRIM")
キー列の列名が異なると、両方の列が残ってしまうので、必要でなければdrop()メソッドで削除してください。
結合方法を指定する(how)
データフレームの結合方法を指定します。何も指定しなければ、内部結合が選択されます。
内部結合(inner)
“CRIM”列をキーとして内部結合してみます。
df1.merge(df2, on="CRIM", how="inner")
外部結合(outer)
キーとして指定した列以外は、名前が同じであっても異なる列として認識されます。
また、データが存在しない箇所は欠損値(NaN)となります。
df1.merge(df3, on="CRIM", how="outer")
左結合(left)
左側(下記コードではdf1)を中心とした結合です。
左側のキーに一致するデータのみ結合するので、下記の場合では右側データはすべて欠損値になっています。
df1.merge(df3, on="CRIM", how="left")
右結合(right)
先ほどとは逆で、右側を中心とした結合です。
df1.merge(df3, on="CRIM", how="right")
インデックスをキーとして指定する
列名だけでなく、インデックスをキーとして指定することもできます。
このときの引数は “right_index” または “left_index” で、Trueとすることで指定可能です。
df1.merge(df2, right_index=True, left_index=True)
インデックスをキーにしているので、各データフレームのすべての列が残ります。
join()を使う
インデックスをキーとして指定する場合は、DataFrame.join()メソッドも利用可能です。
*結合する各データフレームに同じ名前の列が存在するとエラーが発生します!
df1.join(df4)
インデックスをキーとしてデータフレームを結合できました。
結合方法を指定する(how)
merge()と同じように、”how” で結合方法を指定することができます(詳細はmerge()欄を見てください)。
なお、join()でのデフォルトは左結合です。
まとめ
複数のデータフレームを横に結合する方法を紹介しました。
個人的には、merge()をよく使っていて、join()はほとんど使っていない気がします^^;というのも、merge()でもインデックスをキーに指定できるうえ、使い勝手が良いので、、
そうはいっても使い勝手は人それぞれです。いろいろ試して、使いやすい方法をマスターしてください^^
ではでは👋