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

【python】pandasのDataFrameを連結(concat)する方法

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

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


目次

pandasのDataFrame結合

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

>>列名をキーとして結合


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

DataFrameを連結

本記事

pd.concat()

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


pd.concat()の使い方

pd.concat()では複数のDataFrameを連結して結合します。

引数objsに連結するDataFrameをリストもしくはタプルに入れて指定します。(objs=は省略するのが一般的)

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_c": ["c", "cc", "C", "CC", "cC"], "col_d": ["d", "dd", "D", "DD", "dD"], "col_e": ["e", "ee", "E", "EE", "eE"]})

# df1とdf2を連結
df3 = pd.concat(objs=[df1, df2])

複数のDataFrameを共通の列名で結合して、縦方向(デフォルト)に連結します。


連結の軸方向を指定(axis)

デフォルトでは縦方向に結合しますが、横方向の連結が可能です。

引数axis=1を指定することで横方向に連結します。縦方向(デフォルト)は引数axis=0です。

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_c": ["c", "cc", "C", "CC", "cC"], "col_d": ["d", "dd", "D", "DD", "dD"], "col_e": ["e", "ee", "E", "EE", "eE"]})

# 横方向に連結(axis=1)
df3 = pd.concat([df1, df2], axis=1)

横方向に連結する場合、インデックスをキーとして共通の値を持つ列を結合します。


結合方法の指定(join)

連結するDataFrameすべての値を結合(外部結合)するか、共通部分のみを結合(内部結合)するか指定できます。

外部結合

内部結合

結合方法を指定するには引数joinを指定します。デフォルトは引数join="outer"で外部結合です。


外部結合

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_c": ["c", "cc", "C", "CC", "cC"], "col_d": ["d", "dd", "D", "DD", "dD"], "col_e": ["e", "ee", "E", "EE", "eE"]})

# 外部結合(デフォルト)
df3 = pd.concat([df1, df2], join="outer")

すべての値を結合して、共通しない部分はNaN(Not a Number)で埋められます。


内部結合

内部結合は引数join="inner"を指定します。

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_c": ["c", "cc", "C", "CC", "cC"], "col_d": ["d", "dd", "D", "DD", "dD"], "col_e": ["e", "ee", "E", "EE", "eE"]})

# 内部結合(join="inner")
df3 = pd.concat([df1, df2], join="inner")

連結するDataFrameの共通する列名の値だけが結合されます。


インデックスを無視(ignore_index)

引数ignore_index=Trueを指定すると、DataFrameを連結後、連結の軸方向のインデックスを無視して0から値を振り直します。(デフォルトはFalse)

連結方向が縦方向の場合はDataFrameインデックスが、横方向の場合はDataFrameの列名が結合後に無視されて新しく0から順に値が振られます。

連結が縦方向

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_c": ["c", "cc", "C", "CC", "cC"], "col_d": ["d", "dd", "D", "DD", "dD"], "col_e": ["e", "ee", "E", "EE", "eE"]})

# 連結後、縦方向のインデックスを無視(ignore_index=True)
df3 = pd.concat([df1, df2], ignore_index=True, axis=0)

結合後のDataFrameインデックスが0から順に振られています。


連結が横方向

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_c": ["c", "cc", "C", "CC", "cC"], "col_d": ["d", "dd", "D", "DD", "dD"], "col_e": ["e", "ee", "E", "EE", "eE"]})

# df1とdf2を連結
df3 = pd.concat([df1, df2], ignore_index=True, axis=1)

結合後のDataFrameの列名が0から順に値が振り直されています。


元のDataFrameの判別ラベルを付与(keys)

連結した後のDataFrameのインデックスに元のDataFrameのラベルをつけることができます。

引数keysに元のDataFrameを指すラベルを指定します。

連結が縦方向の場合は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_c": ["c", "cc", "C", "CC", "cC"], "col_d": ["d", "dd", "D", "DD", "dD"], "col_e": ["e", "ee", "E", "EE", "eE"]})

# 元のDataFrameの判別ラベルを付与
df3 = pd.concat([df1, df2], keys=["No.1", "No.2"])

引数keysに指定した値が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_c": ["c", "cc", "C", "CC", "cC"], "col_d": ["d", "dd", "D", "DD", "dD"], "col_e": ["e", "ee", "E", "EE", "eE"]})

# 元のDataFrameの判別ラベルを付与
df3 = pd.concat([df1, df2], keys=["No.1", "No.2"], axis=1)

引数keysに指定した値がDataFrame列名の上に表示されます。


まとめ

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

複数のDataFrameを扱う際はとても便利ですので、ぜひ活用してみてください。

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