Pandas concat 徹底解説: データフレームを効率的に結合・連結!


 

データ分析のワークフローでは、複数のデータソースから得られたデータを一つにまとめたり、分割されたデータフレームを再び連結したりする作業が頻繁に発生します。Pandasの**concat**関数は、このようなデータフレームの「結合」や「連結」を非常に柔軟かつ効率的に行うための強力なツールです。

この記事では、Pandas concatの基本的な使い方から、行方向・列方向の結合、そしてインデックスの扱い方や応用テクニックまで、徹底的に解説します。


 

Pandas concatってどんなもの?

 

Pandasのconcat関数は、複数のSeriesやDataFrameを**結合(concatenate)**するための機能です。SQLのUNION操作やExcelのシートを縦に結合するイメージに近く、既存のデータフレームの構造(列や行)を基準にして、データを追加していく際に使われます。

 

concatでできること

 

  • 行方向の結合 (デフォルト): 複数のDataFrameを上下に積み重ねて、行数を増やします。

  • 列方向の結合: 複数のDataFrameを左右に並べて、列数を増やします。

  • インデックスの調整: 結合後のインデックスをリセットしたり、元のインデックスを保持したりできます。

  • 共通・非共通列の扱い: 結合するDataFrame間で列が一致しない場合の挙動を制御できます。


 

なぜconcatを選ぶべきか?

 

データフレームの結合にはmergejoinといったメソッドもありますが、concatを使うことには以下のようなメリットがあります。

  • シンプルで直感的: 複数のデータセットを単純に連結したい場合に、最もシンプルで直感的な方法です。

  • 柔軟な軸指定: 行方向(axis=0)と列方向(axis=1)のどちらにも簡単に結合できます。

  • 非共通部分の扱い: 結合するデータフレーム間で列やインデックスが一致しない場合でも、join引数でinner(共通部分のみ)またはouter(全て結合し欠損値はNaN)を柔軟に指定できます。

  • Seriesの結合も可能: DataFrameだけでなく、Seriesの結合にも利用できます。


 

concatを始めるための準備

 

 

1. ライブラリのインポートとデータの準備

 

concatを使うためには、Pandasライブラリをインポートし、結合したいデータがDataFrameまたはSeries形式で用意されている必要があります。

Python
 
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')

 

df1df2を上下に連結します。df2にしかないQ3_2023_Sales, Q4_2023_Sales列や、df1にしかないQ1_2023_Sales, Q2_2023_Sales列は、それぞれのDataFrameにNaNで埋められて結合されます。

Python
 
# df1 と df2 を行方向に結合 (デフォルト設定)
concatenated_rows = pd.concat([df1, df2])
print("--- 行方向結合 (デフォルト) ---")
print(concatenated_rows)
print("\n")

 

例2: 行方向の結合 (ignore_index=True)

 

結合後のインデックスをリセットし、新しい0からの連番にします。

Python
 
# 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')

 

df1df2を左右に連結します。Product列は両方に存在するため、重複して表示されます(mergeとは異なる挙動)。インデックスが一致しない場合、NaNで埋められます。

Python
 
# 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間で共通する列のみが残ります。

Python
 
# df1 と df2 を行方向に結合し、共通する列のみ残す
concatenated_rows_inner = pd.concat([df1, df2], join='inner')
print("--- 行方向結合 (Inner Join) ---")
print(concatenated_rows_inner) # 'Product'列のみが残る
print("\n")

 

2. 結合元の識別 (keys引数)

 

結合元のDataFrameを識別するための多重インデックスを自動で生成します。

Python
 
# 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は利用できます。

Python
 
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")

 

concatmergejoinの使い分け

 

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爆速講座