Udemy の Webスクレイピングコースを 90%OFF で学べます!! >> クーポンは10/27(金)まで

【python】pandasのDataFrameを結合(merge)する方法

この記事ではpandasライブラリにおけるDataFrameを結合(merge)する方法を具体的に解説します。

サンプルコードをコピペしながらサクサク処理を試せますので、 ぜひ活用してみてください。

目次

pandasのDataFrame結合

pandasにおいてDataFrameを結合する方法は大きく3種類存在します。

列名をキーとして結合

本記事

pd.merge()
pd.DataFrame.merge()

>>DataFrameを連結


pd.concat()

この記事ではpd.merge(), pd.DataFrame.merge()での結合方法を具体的に紹介します。


pd.merge(), pd.DataFrame.merge()の使い方

pd.merge(), pd.DataFrame.merge()での結合において、指定する引数は基本的に同じです。

サンプルコードには両方の結合方法を書きますが、処理の結果は同じですのでお好きな方を選んで使ってください。

複数のDataFrameを結合する際、共通の列名をを持つ場合、持たない場合が考えられます。

これらを場合分けで解説していきます。


共通の列名を持つDataFrameの結合

共通の列名col_cを持つ2つのDataFrameを結合してみましょう。

import pandas as pd

# 2つのDataFrameを作成(共通の列col_aを持つ)
df1 = pd.DataFrame({"col_a": ["a", "aa", "A", "AA", "aA"], "col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"]})
df2 = pd.DataFrame({"col_c": ["c", "cc", "C", "CC", "cC"], "col_y": ["y", "yy", "Y", "YY", "yY"], "col_z": ["z", "zz", "Z", "ZZ", "zZ"]})

# df1とdf2を結合(pd.merge()メソッドで結合)
df3 = pd.merge(df1, df2)

# df1とdf2を結合(pd.DataFrame.merge()メソッドで結合)
df3 = df1.merge(df2)

列名col_cをもつdf1df2を結合して新たなdf3を作成しました。

pd.merge()で結合する場合は引数に結合したいDataFrameを、

pd.DataFrame.merge()で結合する場合はDataFrameに対して直接.merge()を適用して引数に結合したいDataFrameを指定します。

キーとなる列名を指定(on)

結合するDataFrameの中に共通する列名が2つ以上ある場合、キーとなる列名を明示的に指定できます。

共通の列名col_bcol_cを持つ2つDataFrameを結合します。


まずは、引数onNone(デフォルト)を指定した場合を見てみましょう。

import pandas as pd

# 2つのDataFrameを作成(共通の列col_b, col_cを持つ)
df1 = pd.DataFrame({"col_a": ["a", "aa", "A", "AA", "aA"], "col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"]})
df2 = pd.DataFrame({"col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"], "col_z": ["z", "zz", "Z", "ZZ", "zZ"]})

# キーとなる列名を指定しない(引数on=None)
## pd.merge()メソッドで結合
df3 = pd.merge(df1, df2, on=None)

## pd.DataFrame.merge()メソッドで結合
df3 = df1.merge(df2, on=None)

共通するすべての列がそのまま結合されており、共通列が1つの場合と同様の結合の仕方になります。

次に、引数on"col_b"を指定した場合を見てみましょう。

import pandas as pd

# 2つのDataFrameを作成(共通の列col_b, col_cを持つ)
df1 = pd.DataFrame({"col_a": ["a", "aa", "A", "AA", "aA"], "col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"]})
df2 = pd.DataFrame({"col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"], "col_z": ["z", "zz", "Z", "ZZ", "zZ"]})

# キーとなる列名を"col_b"と指定(引数on="col_b")
## pd.merge()メソッドで結合
df3 = pd.merge(df1, df2, on="col_b")

# df1とdf2を結合(pd.DataFrame.merge()メソッドで結合)
df3 = df1.merge(df2, on="col_b")

引数onで指定したcol_bは結合後ひとつにまとまっていますが、指定していない方の共通列col_cが新たに列col_c_x, col_c_yとなって生成されています。

共通列が複数ある場合は、明示的にキーとなる列名を引数onに指定することでその他の共通列を残したまま結合できます。

ここで、残した共通列col_cに自動的にcol_c_x, col_c_yという列名が付与(サフィックス)されましたが、付与させる文字列を指定することもできます。


サフィックスの指定(suffixes)

import pandas as pd

# 2つのDataFrameを作成(共通の列col_b, col_cを持つ)
df1 = pd.DataFrame({"col_a": ["a", "aa", "A", "AA", "aA"], "col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"]})
df2 = pd.DataFrame({"col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"], "col_z": ["z", "zz", "Z", "ZZ", "zZ"]})

# サフィックスをそれぞれ"_A", "_B"と指定(引数suffixes=["_A", "_B"])
## pd.merge()メソッドで結合
df3 = pd.merge(df1, df2, on="col_b", suffixes=["_A", "_B"])

## pd.DataFrame.merge()メソッドで結合
df3 = df1.merge(df2, on="col_b", suffixes=["_A", "_B"])
デフォルト(引数suffixes=["_x", "_y"])
引数suffixes=["_A", "_B"]

共通の列名を持たないDataFrameの結合

左側&右側キー列を指定(left_on, right_on)

共通の列名を持たないDataFrameどうしの結合では、

左側DataFrameのキーとなる列名(left_on)、右側DataFrameのキーとなる列名(right_on)をそれぞれ指定します。


例を見てみましょう。

import pandas as pd

# 2つのDataFrameを作成(共通の列名を持たない)
df1 = pd.DataFrame({"col_a": ["a", "aa", "A", "AA", "aA"], "col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"]})
df2 = pd.DataFrame({"col_a'": ["a'", "a'a'", "A", "AA", "a'A"], "col_y": ["y", "yy", "Y", "YY", "yY"], "col_z": ["z", "zz", "Z", "ZZ", "zZ"]})

# 左側を列名"col_a"、右側を列名"col_a'"と指定
## pd.merge()メソッドで結合
df3 = pd.merge(df1, df2, left_on="col_a", right_on="col_a'")

## pd.DataFrame.merge()メソッドで結合
df3 = df1.merge(df2, left_on="col_a", right_on="col_a'")

左側と右側で指定した列名どうしを基準にDataFrameを結合します。

ここでは、共通の値が入っている行のみが残っていますが、結合方法によって他の行を残すことができます。


結合方法を指定(how)

指定可能な結合方法は主に以下の4つです。

内部結合(デフォルト)

左外部結合

右外部結合

完全外部結合

内部結合(inner)

複数のDataFrameの共通部分だけを残すように結合する方法です。

import pandas as pd

# 2つのDataFrameを作成(共通の列名を持たない)
df1 = pd.DataFrame({"col_a": ["a", "aa", "A", "AA", "aA"], "col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"]})
df2 = pd.DataFrame({"col_a'": ["a'", "a'a'", "A", "AA", "a'A"], "col_y": ["y", "yy", "Y", "YY", "yY"], "col_z": ["z", "zz", "Z", "ZZ", "zZ"]})

# 内部結合(デフォルト)を指定(引数how="inner")
## pd.merge()メソッドで結合
df3 = pd.merge(df1, df2, how="inner", left_on="col_a", right_on="col_a'")

## pd.DataFrame.merge()メソッドで結合
df3 = df1.merge(df2, how="inner",  left_on="col_a", right_on="col_a'")
内部結合

デフォルトの内部結合をそのまま指定したので、先ほどと全く同じ結果が得られます。


左外部結合(left)

左外部結合では左側DataFrameに右側DataFrameを足す形になります。

import pandas as pd

# 2つのDataFrameを作成(共通の列名を持たない)
df1 = pd.DataFrame({"col_a": ["a", "aa", "A", "AA", "aA"], "col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"]})
df2 = pd.DataFrame({"col_a'": ["a'", "a'a'", "A", "AA", "a'A"], "col_y": ["y", "yy", "Y", "YY", "yY"], "col_z": ["z", "zz", "Z", "ZZ", "zZ"]})

# 左外部結合を指定(引数how="left")
## pd.merge()メソッドで結合
df3 = pd.merge(df1, df2, how="left", left_on="col_a", right_on="col_a'")

## pd.DataFrame.merge()メソッドで結合
df3 = df1.merge(df2, how="left",  left_on="col_a", right_on="col_a'")
左外部結合

左側DataFrameを基準に列col_aと列col_a'で共通の値を持つ行を結合します。

共通の値を持たない行の値はNaN(Not a Number)で埋められます。


右外部結合(right)

右外部結合では右側DataFrameに左側DataFrameを足す形になります。

import pandas as pd

# 2つのDataFrameを作成(共通の列名を持たない)
df1 = pd.DataFrame({"col_a": ["a", "aa", "A", "AA", "aA"], "col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"]})
df2 = pd.DataFrame({"col_a'": ["a'", "a'a'", "A", "AA", "a'A"], "col_y": ["y", "yy", "Y", "YY", "yY"], "col_z": ["z", "zz", "Z", "ZZ", "zZ"]})

# 右外部結合を指定(引数how="right")
## pd.merge()メソッドで結合
df3 = pd.merge(df1, df2, how="right", left_on="col_a", right_on="col_a'")

## pd.DataFrame.merge()メソッドで結合
df3 = df1.merge(df2, how="right",  left_on="col_a", right_on="col_a'")
右外部結合

右側DataFrameを基準に列col_aと列col_a'で共通の値を持つ行を結合します。

共通の値を持たない行の値はNaN(Not a Number)で埋められます。


完全外部結合(outer)

完全外部結合では両方のDataFrameをそのまま足す形になります。

import pandas as pd

# 2つのDataFrameを作成(共通の列名を持たない)
df1 = pd.DataFrame({"col_a": ["a", "aa", "A", "AA", "aA"], "col_b": ["b", "bb", "B", "BB", "bB"], "col_c": ["c", "cc", "C", "CC", "cC"]})
df2 = pd.DataFrame({"col_a'": ["a'", "a'a'", "A", "AA", "a'A"], "col_y": ["y", "yy", "Y", "YY", "yY"], "col_z": ["z", "zz", "Z", "ZZ", "zZ"]})

# 完全外部結合を指定(引数how="outer")
## pd.merge()メソッドで結合
df3 = pd.merge(df1, df2, how="outer", left_on="col_a", right_on="col_a'")

## pd.DataFrame.merge()メソッドで結合
df3 = df1.merge(df2, how="outer",  left_on="col_a", right_on="col_a'")
完全外部結合

両方のDataFrameをに列col_aと列col_a'で共通の値を持つ行を結合し、

共通の値を持たない行の値はNaN(Not a Number)で埋められます。

まとめ

今回はpandasのDataFrameを結合(merge)する方法を具体的に紹介しました。

複数のデータを同時に扱う際にとても便利ですので、ぜひ活用してみてください。


よかったらシェアしてね!
目次