この記事ではpandasライブラリにおけるDataFrameを連結(concat)する方法を具体的に解説します。
サンプルコードをコピペしながらサクサク処理を試せますので、 ぜひ活用してみてください。
pandasのDataFrame
結合
pandasにおいてDataFrame
を結合する方法は大きく3種類存在します。
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を扱う際はとても便利ですので、ぜひ活用してみてください。