Python | データ処理:pandas concat

Python
スポンサーリンク

概要(pandas.concatは「複数の表を縦・横にまとめる」ための基本ツール)

pandas.concatは、複数のDataFrameやSeriesを連結して1つのDataFrameにまとめる関数です。縦方向(行を足す)と横方向(列を並べる)の両方に対応し、インデックスや列の合わせ方、結合範囲の選び方を柔軟に制御できます。初心者がまず押さえるべきポイントは、axis、ignore_index、join、keysの4つです。


基本の使い方(縦結合と横結合の違いを掴む)

行を積み増す(縦結合:axis=0)

import pandas as pd

df1 = pd.DataFrame({"id": [1, 2], "name": ["Taro", "Hanako"]})
df2 = pd.DataFrame({"id": [3], "name": ["Jiro"]})

out = pd.concat([df1, df2], axis=0)  # 縦に積む(デフォルト)
print(out)
#    id    name
# 0   1    Taro
# 1   2  Hanako
# 0   3    Jiro
Python

縦結合は「同じ列」を持つ表を行方向へまとめます。インデックスは元の値が保たれるため、重複しがちです(後述のignore_indexで解決できます)。

列を並べる(横結合:axis=1)

df_a = pd.DataFrame({"id": [1, 2], "name": ["Taro", "Hanako"]})
df_b = pd.DataFrame({"score": [85, 92]})

out = pd.concat([df_a, df_b], axis=1)  # 横に並べる
print(out)
#    id    name  score
# 0   1    Taro     85
# 1   2  Hanako     92
Python

横結合は、行インデックスをキーにして「左の表の右側へ列を追加」します。インデックスが揃っていないと、欠損(NaN)が入りやすいので整えるのがコツです。


重要オプションの深掘り(axis・ignore_index・join・keys)

axis(どちら向きに連結するかを決める)

  • axis=0(デフォルト):縦に連結。行を追加していく。
  • axis=1:横に連結。列を追加していく。
pd.concat([df1, df2], axis=0)  # 行を追加
pd.concat([df1, df2], axis=1)  # 列を追加
Python

ignore_index(インデックスの重複を避けて連番に振り直す)

df1 = pd.DataFrame({"A": [1, 2]})
df2 = pd.DataFrame({"A": [3, 4]})

out = pd.concat([df1, df2], ignore_index=True)
print(out)
#    A
# 0  1
# 1  2
# 2  3
# 3  4
Python

縦結合時はほぼ毎回使うつもりでOK。重複インデックスのままだと後で混乱します。

join(列の合わせ方:outerかinnerか)

  • join=”outer”(デフォルト):存在する列を全部残す。足りない部分はNaN。
  • join=”inner”:共通列のみ残す。列名の不一致を切り捨てて整える。
left = pd.DataFrame({"id": [1, 2], "name": ["Taro", "Hanako"]})
right = pd.DataFrame({"id": [3], "score": [90]})

print(pd.concat([left, right], join="outer", ignore_index=True))
#    id    name  score
# 0   1    Taro    NaN
# 1   2  Hanako    NaN
# 2   3     NaN   90.0

print(pd.concat([left, right], join="inner", ignore_index=True))
#    id
# 0   1
# 1   2
# 2   3
Python

列設計が揃っていないデータをまとめるとき、「全部残すか」「共通だけに絞るか」を選ぶのがjoinです。

keys(グループラベルを付けて出所を保つ)

jan = pd.DataFrame({"day": [1, 2], "sales": [100, 120]})
feb = pd.DataFrame({"day": [1, 2], "sales": [130, 140]})

out = pd.concat([jan, feb], keys=["Jan", "Feb"], ignore_index=False)
print(out)
#         day  sales
# Jan 0     1    100
#     1     2    120
# Feb 0     1    130
#     1     2    140
Python

MultiIndex(階層インデックス)で「どの表から来た行か」を保持できます。後でグループ集計するときに便利です。


実践例(ディレクトリ内の月別CSVをまとめる・列揃え・横連結)

例1:複数CSVを縦にまとめる(ignore_indexが効く)

import pandas as pd
from glob import glob

files = sorted(glob("data/sales_2025-*.csv"))  # 例: sales_2025-01.csv, -02.csv ...
dfs = [pd.read_csv(p) for p in files]

all_sales = pd.concat(dfs, ignore_index=True)  # 行を積み増す
print(all_sales.head())
Python

「同じ列構成の月次ファイル」をまとめる鉄板パターン。まずconcat→その後に型変換・前処理を行うとスムーズです。

例2:列が少し違うファイルをまとめる(joinで共通列に絞る)

df_a = pd.DataFrame({"id": [1, 2], "name": ["Taro", "Hanako"]})
df_b = pd.DataFrame({"id": [3], "score": [90]})

out_outer = pd.concat([df_a, df_b], join="outer", ignore_index=True)
out_inner = pd.concat([df_a, df_b], join="inner", ignore_index=True)
print(out_outer)  # 全列を残す(欠損あり)
print(out_inner)  # 共通の"id"だけ
Python

列ズレを「全部残すか」「共通だけに揃えるか」を先に決めるだけで、迷いが減ります。

例3:指標を横に並べる(インデックス合わせがカギ)

daily = pd.DataFrame({"date": ["2025-01-01", "2025-01-02"], "users": [10, 12]}).set_index("date")
sales = pd.DataFrame({"date": ["2025-01-01", "2025-01-02"], "sales": [150, 200]}).set_index("date")

out = pd.concat([daily, sales], axis=1)  # 同じインデックス(date)で横結合
print(out)
#             users  sales
# 2025-01-01     10    150
# 2025-01-02     12    200
Python

横結合は「インデックスを合わせる」のが最重要。先にset_indexしておくときれいに揃います。


つまずきやすいポイントの対策(インデックス・列名・欠損)

インデックス重複はignore_indexで回避する

縦結合した後のインデックスが重複すると、行選択・グループ処理で混乱します。基本はignore_index=True。その上で必要なら新しいキー列(yearやmonth)を自分で追加します。

列名のブレを早めにそろえる

結合前にrenameで列名を統一すると、join=”inner”でも「意図せず列が消える」事故を避けられます。大文字小文字、全角半角、スペースの有無は最初に正規化。

df = df.rename(columns={"Name": "name", " ID ": "id"})
Python

欠損(NaN)は後でまとめて処理する

outerで結合した結果のNaNは、fillnaや型変換で整える流れにしましょう。先に結合→後で欠損処理、が定番です。

out["score"] = out["score"].fillna(0).astype(int)
Python

番外編(concatとmergeの使い分け、メモリ・パフォーマンスのコツ)

concatとmergeの違い(覚え方)

  • concat:形が似た表を縦に積む/横に並べる。キー結合はしない。
  • merge:キー(idなど)で行同士を突き合わせて結合する。SQLのJOINに相当。

「月次をまとめる」「指標を横に並べる」はconcat、「マスタ情報をidで付ける」はmergeが基本です。

メモリ・パフォーマンスのコツ

  • 大量ファイルは「都度concat」より「リストへ集めて最後に1回concat」が速いことが多いです。
  • 型を先に揃える(idを文字列へ、日付をdatetimeへ)と、結合後の変換コストが減ります。
  • 巨大データはchunk(分割読み)で小さなDataFrameを作り、最後にconcatするのが安全です。

まとめ(axis・ignore_index・join・keysを使い分ければ怖くない)

pandas.concatは、複数データの「縦積み」「横並べ」を一気にこなす基本関数です。方向はaxisで決め、縦結合ではignore_indexで行ラベルを振り直す。列の揃え方はjoinで選び、出所を保ちたいときはkeysでラベル化。結合前に列名・インデックスを整え、欠損は結合後に処理する。この型を守れば、初心者でも迷わず安定したデータ統合ができるようになります。

タイトルとURLをコピーしました