Pandasで2つのDataFrameを結合するpd.mergeの使い方をチェック!

この記事では2つのpandas.DataFrameを結合する関数pd.mergeについて紹介します。pandas.DataFrame.mergeメソッドとしても同じ機能が提供されているので、どちらか好きな方を使ってください。

この関数は2つのDataFrameを横方向に結合する機能があります。データ解析で特徴量をそれぞれのDataFrameで作った後に結合する、などの使い方ができるので、ぜひ覚えておきましょう。

目次

pandas.mergeの使い方[基本編]

前準備

サンプルのDataFrameを2つ用意しましょう。

In [1]:
import pandas as pd 
import numpy as np
In [2]:
data = np.arange(0,20).reshape(4,5)
feature_names = np.array(["a","b","c","d","e"])
df1 = pd.DataFrame(data[:,:3], 
                   columns=feature_names[:3])

df1
Out[2]:
a b c
0 0 1 2
1 5 6 7
2 10 11 12
3 15 16 17
In [3]:
df2 = pd.DataFrame(data[:,[2,3,4,0]], 
                   columns=feature_names[[2,3,4,0]])

df2
Out[3]:
c d e a
0 2 3 4 0
1 7 8 9 5
2 12 13 14 10
3 17 18 19 15

2つのDataFrameを横に結合

pd.mergeは2つのDataFrameを横に結合する関数です。この機能を使うことで、2つのDataFrameの同じ列を統合して新しいDataFrameを作成できます。

In [4]:
pd.merge(df1,df2)
Out[4]:
a b c d e
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19

pandas.mergeの使い方[応用編]

on引数で明示的に統合する列を指定

on引数に統合させたい列名を指定することで、その列のみを統合した新しいDataFrameを作成できます。

ここで指定した列以外で重複箇所がある場合は、c_x, c_yのように第一引数と第二引数のDataFrameの列が区別できるような名前が割り当てられます。

In [5]:
pd.merge(df1,df2, on="a")
Out[5]:
a b c_x c_y d e
0 0 1 2 2 3 4
1 5 6 7 7 8 9
2 10 11 12 12 13 14
3 15 16 17 17 18 19
In [6]:
pd.merge(df1,df2, on="c")
Out[6]:
a_x b c d e a_y
0 0 1 2 3 4 0
1 5 6 7 8 9 5
2 10 11 12 13 14 10
3 15 16 17 18 19 15

複数の列を指定する場合はlistにまとめればOKです。

In [7]:
pd.merge(df1,df2, on=["a","c"])
Out[7]:
a b c d e
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19

how引数で結合の方法を変える

how引数は何も指定しない場合、how=”inner”とされています。これはDataFrame同士をどうやって結合するかを決めています。howの値は以下の4つが使えます。

  • inner
  • 第一引数と第二引数で共通する列を使う

  • outer
  • 第一引数と第二引数の両方の列を使う

  • left
  • 第一引数(左)の列をすべて使う

  • right
  • 第二引数(右)の列をすべて使う

    In [8]:
    df3 = df2.copy()
    df3["a"]= [10,20,30,40]
    df3
    Out[8]:
    c d e a
    0 2 3 4 10
    1 7 8 9 20
    2 12 13 14 30
    3 17 18 19 40
    In [9]:
    pd.merge(df1,df3, how="outer")
    Out[9]:
    a b c d e
    0 0 1.0 2 NaN NaN
    1 5 6.0 7 NaN NaN
    2 10 11.0 12 NaN NaN
    3 15 16.0 17 NaN NaN
    4 10 NaN 2 3.0 4.0
    5 20 NaN 7 8.0 9.0
    6 30 NaN 12 13.0 14.0
    7 40 NaN 17 18.0 19.0
    In [10]:
    pd.merge(df1,df3, how="left")
    Out[10]:
    a b c d e
    0 0 1 2 NaN NaN
    1 5 6 7 NaN NaN
    2 10 11 12 NaN NaN
    3 15 16 17 NaN NaN
    In [11]:
    pd.merge(df1,df3, how="right")
    Out[11]:
    a b c d e
    0 10 NaN 2 3 4
    1 20 NaN 7 8 9
    2 30 NaN 12 13 14
    3 40 NaN 17 18 19
    In [12]:
    pd.merge(df2,df3, how="outer")
    Out[12]:
    c d e a
    0 2 3 4 0
    1 7 8 9 5
    2 12 13 14 10
    3 17 18 19 15
    4 2 3 4 10
    5 7 8 9 20
    6 12 13 14 30
    7 17 18 19 40

    まとめ

    この記事では2つのpandas.DataFrameを結合する関数pd.mergeを紹介しました。この記事で解説したpd.mergeの大事なことは以下の通り。

    • 2つのDataFrameを結合できる
    • on引数で統合する列名を(複数)指定できる
    • how引数で結合方法を選択できる


    この3つを覚えて使いこなしてください。

    この記事を書いた人

    【プロフィール】
    DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
    累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
    【専門分野】
    IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

    目次