この記事ではpandasライブラリにおけるDataFrameを結合(merge)する方法を具体的に解説します。
サンプルコードをコピペしながらサクサク処理を試せますので、 ぜひ活用してみてください。
pandasのDataFrame結合
pandasにおいてDataFrameを結合する方法は大きく3種類存在します。
列名をキーとして結合
pd.merge()
pd.DataFrame.merge()
この記事では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をもつdf1とdf2を結合して新たなdf3を作成しました。
pd.merge()で結合する場合は引数に結合したいDataFrameを、
pd.DataFrame.merge()で結合する場合はDataFrameに対して直接.merge()を適用して引数に結合したいDataFrameを指定します。
キーとなる列名を指定(on)
結合するDataFrameの中に共通する列名が2つ以上ある場合、キーとなる列名を明示的に指定できます。
まずは、引数onにNone(デフォルト)を指定した場合を見てみましょう。
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)する方法を具体的に紹介しました。
複数のデータを同時に扱う際にとても便利ですので、ぜひ活用してみてください。



