【Pandas】データフレームを横方向に結合する

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()でもインデックスをキーに指定できるうえ、使い勝手が良いので、、

そうはいっても使い勝手は人それぞれです。いろいろ試して、使いやすい方法をマスターしてください^^

ではでは👋