Pandas concat 徹底解説: データフレームを効率的に結合・連結!
データ分析のワークフローでは、複数のデータソースから得られたデータを一つにまとめたり、分割されたデータフレームを再び連結したりする作業が頻繁に発生します。Pandasの**concat**関数は、このようなデータフレームの「結合」や「連結」を非常に柔軟かつ効率的に行うための強力なツールです。
この記事では、Pandas concatの基本的な使い方から、行方向・列方向の結合、そしてインデックスの扱い方や応用テクニックまで、徹底的に解説します。
Pandas concatってどんなもの?
Pandasのconcat関数は、複数のSeriesやDataFrameを**結合(concatenate)**するための機能です。SQLのUNION操作やExcelのシートを縦に結合するイメージに近く、既存のデータフレームの構造(列や行)を基準にして、データを追加していく際に使われます。
concatでできること
-
行方向の結合 (デフォルト): 複数のDataFrameを上下に積み重ねて、行数を増やします。
-
列方向の結合: 複数のDataFrameを左右に並べて、列数を増やします。
-
インデックスの調整: 結合後のインデックスをリセットしたり、元のインデックスを保持したりできます。
-
共通・非共通列の扱い: 結合するDataFrame間で列が一致しない場合の挙動を制御できます。
なぜconcatを選ぶべきか?
データフレームの結合にはmergeやjoinといったメソッドもありますが、concatを使うことには以下のようなメリットがあります。
-
シンプルで直感的: 複数のデータセットを単純に連結したい場合に、最もシンプルで直感的な方法です。
-
柔軟な軸指定: 行方向(
axis=0)と列方向(axis=1)のどちらにも簡単に結合できます。 -
非共通部分の扱い: 結合するデータフレーム間で列やインデックスが一致しない場合でも、
join引数でinner(共通部分のみ)またはouter(全て結合し欠損値はNaN)を柔軟に指定できます。 -
Seriesの結合も可能: DataFrameだけでなく、Seriesの結合にも利用できます。
concatを始めるための準備
1. ライブラリのインポートとデータの準備
concatを使うためには、Pandasライブラリをインポートし、結合したいデータがDataFrameまたはSeries形式で用意されている必要があります。
import pandas as pd
# サンプルデータフレーム1 (2023年上半期の売上)
df1 = pd.DataFrame({
'Product': ['A', 'B', 'C'],
'Q1_2023_Sales': [100, 150, 120],
'Q2_2023_Sales': [110, 160, 130]
})
# サンプルデータフレーム2 (2023年下半期の売上)
df2 = pd.DataFrame({
'Product': ['A', 'B', 'D'], # Product Dはdf1にない
'Q3_2023_Sales': [130, 170, 90],
'Q4_2023_Sales': [140, 180, 100]
})
# サンプルデータフレーム3 (追加の製品情報)
df3 = pd.DataFrame({
'Product': ['E', 'F'],
'Q1_2023_Sales': [50, 60],
'Q2_2023_Sales': [55, 65]
})
print("--- df1 ---")
print(df1)
print("\n")
print("--- df2 ---")
print(df2)
print("\n")
print("--- df3 ---")
print(df3)
print("\n")
concatの基本的な使い方
concat関数には、主に以下の引数を指定します。
-
objs: 結合したいDataFrameまたはSeriesのリスト。 -
axis: 結合の方向を指定。0または'index'で行方向(上下)結合(デフォルト)、1または'columns'で列方向(左右)結合。 -
join: 結合するDataFrame間で列(またはインデックス)が一致しない場合の挙動を指定。'outer'(和集合、デフォルト)または'inner'(積集合)。 -
ignore_index: 結合後のインデックスをリセットするかどうか。Trueにすると新しい0からの連番インデックスが割り当てられます。 -
keys: 結合元のDataFrameを識別するための新しい多重インデックスを作成します。
最小限のサンプルプログラム
例1: 行方向の結合 (デフォルト: axis=0, join='outer')
df1とdf2を上下に連結します。df2にしかないQ3_2023_Sales, Q4_2023_Sales列や、df1にしかないQ1_2023_Sales, Q2_2023_Sales列は、それぞれのDataFrameにNaNで埋められて結合されます。
# df1 と df2 を行方向に結合 (デフォルト設定)
concatenated_rows = pd.concat([df1, df2])
print("--- 行方向結合 (デフォルト) ---")
print(concatenated_rows)
print("\n")
例2: 行方向の結合 (ignore_index=True)
結合後のインデックスをリセットし、新しい0からの連番にします。
# df1 と df3 を行方向に結合し、インデックスをリセット
concatenated_rows_reset_index = pd.concat([df1, df3], ignore_index=True)
print("--- 行方向結合 (インデックスリセット) ---")
print(concatenated_rows_reset_index)
print("\n")
例3: 列方向の結合 (axis=1, join='outer')
df1とdf2を左右に連結します。Product列は両方に存在するため、重複して表示されます(mergeとは異なる挙動)。インデックスが一致しない場合、NaNで埋められます。
# df1 と df2 を列方向に結合 (outer joinがデフォルト)
# ここではインデックスが0,1,2で一致しているため、そのまま結合される
concatenated_cols = pd.concat([df1, df2], axis=1)
print("--- 列方向結合 (デフォルト) ---")
print(concatenated_cols)
print("\n")
concatの応用テクニック
1. 結合時のjoin引数 (inner結合)
join='inner'を指定すると、結合するDataFrame間で共通する列のみが残ります。
# df1 と df2 を行方向に結合し、共通する列のみ残す
concatenated_rows_inner = pd.concat([df1, df2], join='inner')
print("--- 行方向結合 (Inner Join) ---")
print(concatenated_rows_inner) # 'Product'列のみが残る
print("\n")
2. 結合元の識別 (keys引数)
結合元のDataFrameを識別するための多重インデックスを自動で生成します。
# df1 と df2 を行方向に結合し、結合元を識別するキーを追加
concatenated_with_keys = pd.concat([df1, df2], keys=['df1_data', 'df2_data'])
print("--- 結合元を識別するキー付き結合 ---")
print(concatenated_with_keys)
print(concatenated_with_keys.loc['df1_data']) # キーを使ってアクセス
print("\n")
3. Seriesの結合
DataFrameだけでなく、Seriesの結合にもconcatは利用できます。
s1 = pd.Series([1, 2, 3], name='A')
s2 = pd.Series([4, 5, 6], name='B')
# Seriesを行方向に結合 (DataFrameになる)
concatenated_series_rows = pd.concat([s1, s2])
print("--- Seriesを行方向に結合 (デフォルト) ---")
print(concatenated_series_rows)
print("\n")
# Seriesを列方向に結合 (DataFrameになる)
concatenated_series_cols = pd.concat([s1, s2], axis=1)
print("--- Seriesを列方向に結合 ---")
print(concatenated_series_cols)
print("\n")
concatとmerge、joinの使い分け
Pandasには複数の結合関数があり、それぞれ最適な利用シーンがあります。
-
pd.concat():-
単純な連結: 行方向または列方向に、データフレームを文字通り「結合」したい場合に最も適しています。
-
インデックス(または列名)の一致が厳密でなくても良い場合(
outer結合でNaNを許容する場合)。 -
SQLの
UNION操作に近い。
-
-
pd.merge():-
共通のキーに基づいてデータフレームを「結合」したい場合。
-
SQLの
JOIN操作(INNER JOIN,LEFT JOINなど)に直接対応します。 -
リレーショナルなデータ統合に非常に強力です。
-
-
df.join():-
DataFrameのメソッド。インデックスをキーとして結合する場合に簡潔に書けます。
-
merge(left_index=True, right_index=True)のショートカット的な位置づけ。
-
簡単な使い分けの例:
-
concat: 「同じ構造の月ごとの売上データを上下に結合して年間のデータを作る」「ユーザー情報と追加情報を左右に並べるが、インデックスがそのまま対応している」 -
merge: 「ユーザーIDをキーに、ユーザー情報と注文履歴を結合する」「商品コードをキーに、商品マスタと日次売上を結合する」
まとめ
この記事では、Pandasで複数のDataFrameやSeriesを効率的に結合・連結する**concat**関数について、その特徴、行方向・列方向の基本的な結合方法、インデックスの扱い方、そしてkeys引数などの応用テクニックを徹底的に解説しました。
concatを適切に使いこなすことで、様々なソースから得られたデータを柔軟に組み合わせ、データ分析の準備作業を大幅に効率化できます。あなたのPandasによるデータ操作ワークフローにconcatをぜひ取り入れてみてください!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

