概要(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) # 列を追加
Pythonignore_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
PythonMultiIndex(階層インデックス)で「どの表から来た行か」を保持できます。後でグループ集計するときに便利です。
実践例(ディレクトリ内の月別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でラベル化。結合前に列名・インデックスを整え、欠損は結合後に処理する。この型を守れば、初心者でも迷わず安定したデータ統合ができるようになります。
