データ分析でよく使われるPandasのDataFrame。複数のDataFrameを結合して、より大きなデータセットを作りたい場面は多々あります。今回は、PandasでDataFrame同士を結合する、特に列方向と行方向の結合に焦点を当てて、具体的な例を示しながら解説します。
列方向:
df = pd.concat([df1, df2], axis=1)行方向:
df = pd.concat([df1, df2])はじめに: 結合の種類
Pandasでは、主に以下の方法でDataFrameを結合できます。
concat(): 複数のDataFrameを列方向または行方向に単純に連結する。merge(): SQLのJOIN操作のように、共通のキー列に基づいてDataFrameを結合する。join(): インデックスをキーとしてDataFrameを結合する。
この記事では、最も基本的なconcat()関数を用いた、列方向と行方向の結合に絞って説明します。merge()やjoin()については、別の機会に詳しく解説します。
1. 列方向に結合する (横に結合)
列方向の結合とは、複数のDataFrameを横に並べるように結合することです。concat()関数のaxis引数に1を指定することで実現できます。

例1: 同じインデックスを持つDataFrameを列方向に結合
まずは、同じインデックスを持つ2つのDataFrameを列方向に結合してみましょう。
import pandas as pd
# DataFrame df1を作成
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['I0', 'I1', 'I2'])
print("df1:\n", df1)
# DataFrame df2を作成
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2']},
index=['I0', 'I1', 'I2'])
print("\ndf2:\n", df2)
# df1とdf2を列方向に結合
result = pd.concat([df1, df2], axis=1)
print("\nresult:\n", result)説明:
- DataFrameの作成:
df1とdf2という2つのDataFrameを作成します。両者とも同じインデックス ('I0','I1','I2') を持っています。 pd.concat([df1, df2], axis=1):concat()関数を使ってdf1とdf2を結合します。axis=1を指定することで列方向に結合されます。- 結果:
resultには、df1の右側にdf2が結合されたDataFrameが格納されます。
出力:
df1:
A B
I0 A0 B0
I1 A1 B1
I2 A2 B2
df2:
C D
I0 C0 D0
I1 C1 D1
I2 C2 D2
result:
A B C D
I0 A0 B0 C0 D0
I1 A1 B1 C1 D1
I2 A2 B2 C2 D2例2: 異なるインデックスを持つDataFrameを列方向に結合
次に、異なるインデックスを持つDataFrameを結合してみましょう。
import pandas as pd
# DataFrame df3を作成
df3 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['I0', 'I1', 'I2'])
print("df3:\n", df3)
# DataFrame df4を作成
df4 = pd.DataFrame({'C': ['C1', 'C2', 'C3'],
'D': ['D1', 'D2', 'D3']},
index=['I1', 'I2', 'I3'])
print("\ndf4:\n", df4)
# df3とdf4を列方向に結合
result = pd.concat([df3, df4], axis=1)
print("\nresult:\n", result)説明:
- DataFrameの作成:
df3とdf4という2つのDataFrameを作成します。df3は'I0','I1','I2'、df4は'I1','I2','I3'というインデックスを持ち、部分的に重複しています。 pd.concat([df3, df4], axis=1):df3とdf4を列方向に結合します。- 結果:
resultでは、結合されたDataFrameは、存在しないデータに対応する要素にNaN(Not a Number) が入っています。df3はインデックスI3の行が欠落しているのでその部分がNaNになり、df4はインデックスI0の行が欠落しているのでその部分がNaNになります。
出力:
df3:
A B
I0 A0 B0
I1 A1 B1
I2 A2 B2
df4:
C D
I1 C1 D1
I2 C2 D2
I3 C3 D3
result:
A B C D
I0 A0 B0 NaN NaN
I1 A1 B1 C1 D1
I2 A2 B2 C2 D2
I3 NaN NaN C3 D32. 行方向に結合する (縦に結合)
行方向の結合とは、複数のDataFrameを縦に積み重ねるように結合することです。concat()関数のaxis引数に0を指定することで実現できます(デフォルトはaxis=0)。

例3: 同じ列を持つDataFrameを行方向に結合
まずは、同じ列を持つ2つのDataFrameを行方向に結合してみましょう。
import pandas as pd
# DataFrame df5を作成
df5 = pd.DataFrame({'A': ['A0', 'A1'],
'B': ['B0', 'B1']},
index=['I0', 'I1'])
print("df5:\n", df5)
# DataFrame df6を作成
df6 = pd.DataFrame({'A': ['A2', 'A3'],
'B': ['B2', 'B3']},
index=['I2', 'I3'])
print("\ndf6:\n", df6)
# df5とdf6を行方向に結合
result = pd.concat([df5, df6]) # axis=0は省略可能
print("\nresult:\n", result)説明:
- DataFrameの作成:
df5とdf6という2つのDataFrameを作成します。両者とも同じ列 ('A','B') を持っています。 pd.concat([df5, df6]):df5とdf6を行方向に結合します。axis=0はデフォルトなので省略可能です。- 結果:
resultには、df5の下にdf6が結合されたDataFrameが格納されます。インデックスは元のDataFrameのものが保持されます。
出力:
df5:
A B
I0 A0 B0
I1 A1 B1
df6:
A B
I2 A2 B2
I3 A3 B3
result:
A B
I0 A0 B0
I1 A1 B1
I2 A2 B2
I3 A3 B3例4: 異なる列を持つDataFrameを行方向に結合
次に、異なる列を持つDataFrameを結合してみましょう。
import pandas as pd
# DataFrame df7を作成
df7 = pd.DataFrame({'A': ['A0', 'A1'],
'B': ['B0', 'B1']},
index=['I0', 'I1'])
print("df7:\n", df7)
# DataFrame df8を作成
df8 = pd.DataFrame({'B': ['B2', 'B3'],
'C': ['C2', 'C3']},
index=['I2', 'I3'])
print("\ndf8:\n", df8)
# df7とdf8を行方向に結合
result = pd.concat([df7, df8])
print("\nresult:\n", result)説明:
- DataFrameの作成:
df7とdf8という2つのDataFrameを作成します。df7は'A','B'、df8は'B','C'という列を持ち、'B'列が共通しています。 pd.concat([df7, df8]):df7とdf8を行方向に結合します。- 結果:
resultでは、結合されたDataFrameは、存在しないデータに対応する要素にNaNが入ります。そして、共通する列Bのデータは、同じ列に収まっています。
出力:
df7:
A B
I0 A0 B0
I1 A1 B1
df8:
B C
I2 B2 C2
I3 B3 C3
result:
A B C
I0 A0 B0 NaN
I1 A1 B1 NaN
I2 NaN B2 C2
I3 NaN B3 C3まとめ
Pandasのconcat()関数を使ってDataFrameを列方向と行方向に結合する方法を解説しました。
- 列方向の結合:
axis=1を指定。横にDataFrameを並べる。 - 行方向の結合:
axis=0を指定 (デフォルト)。縦にDataFrameを積み重ねる。 - インデックスや列が異なる場合は、
NaNで補完される。
これらの基本的な結合方法を理解しておけば、データ分析の様々な場面で役立ちます。
参考になるWEBサイト
- Merge, join, concatenate and compare — pandas 2.2.3 documentation
- pandas.concat — pandas 2.2.3 documentation
- pandas.DataFrame.join — pandas 2.2.3 documentation
これらのサイトでは、concat()だけでなく、merge()やjoin()による結合方法など、さらに詳しい情報が提供されていますので、ぜひ参考にしてください。
今回も少しだけPRです。
Pandasについて詳しく知りたいかた、もっと使いこなしたい方におすすめの本です。数年前に購入しましたが、今も手元に置いて時々見返しています。
「pandasクックブック Pythonによるデータ処理のレシピ」Theodore Petrou著、黒川利明訳。
最後まで読んでいただきありがとうございます。73


コメント