この記事では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)する方法を具体的に紹介しました。
複数のデータを同時に扱う際にとても便利ですので、ぜひ活用してみてください。


