1月、2月、3月と列が増える表は、人が見る帳票には便利でも、月別の集計コードを毎回変える原因になります。店舗と月を組にして集計したいなら、月の列を縦に並べ直す方法があります。
pandasのmeltを使うと、店舗などの識別用の列を残し、2026-01列、2026-02列を「月」「金額」の二列へ変形できます。元の帳票は保ち、集計用の表を別に作る用途に向いています。
備考を残して月列だけを縦へ
次の架空表には、店舗、二か月の金額、備考があります。月の列だけをvalue_varsへ指定します。列を省略すると、備考まで金額の値へ混ぜるおそれがあるためです。
import pandas as pd
wide = pd.DataFrame({
"店舗": ["S1", "S2"],
"2026-01": [10, 20],
"2026-02": [30, 40],
"備考": ["確認済み", "未確認"],
})
months = ["2026-01", "2026-02"]
required = ["店舗", "備考", *months]
if not set(required).issubset(wide.columns):
raise ValueError("必要な列がありません")
long = wide.melt(
id_vars=["店舗", "備考"],
value_vars=months,
var_name="月",
value_name="金額",
)
print("変形後の行数:", len(long))
print("対象月:", sorted(long["月"].unique().tolist()))
print("金額の合計:", long["金額"].sum())
assert len(long) == len(wide) * len(months) == 4
assert long["金額"].sum() == wide[months].sum().sum() == 100
assert set(long["備考"]) == {"確認済み", "未確認"}
二店舗と二か月の組なので、変形後は四行です。合計100は変形前後で変わらず、備考も残ります。Windows・Python 3.12.10・pandas 3.0.2で、この行数と値を確認しました。
実ファイルから読むときは、店舗コードなどの型を先にそろえます。meltは値の正しさを検査する機能ではなく、表の並び方を変える処理です。
残す列と変える列を分ける
id_varsは各行を識別したり補足したりする列です。上では店舗と備考を残しています。value_varsは縦へ並べる月列です。var_nameとvalue_nameは、変形後の列名を決めています。
元の表に担当者や地域があれば、それも残す必要があるかを判断します。逆に、集計に不要な個人情報を残す必要がないなら、出力へ持たせない選択もできます。
新しい月が増えた場合、対象月の一覧を設定へ追加する形にできます。すべての「店舗以外の列」を月だとみなす実装では、新設された備考列や合計列を誤って取り込むため、認める列を明確にします。
合計列をもう一度足さない
帳票に1月、2月、合計という列がある場合、合計までmeltの対象へ入れると、同じ金額を二度数える形になります。対象月は元の帳票の仕様から決め、合計列は検算用として分けます。
行数は元の行数と対象月数の積になるのが、この例の想定です。空欄も行として残るため、空欄を落とす場合は、その前後の件数と意味を別に確認します。未入力を0とするのか、入力待ちとするのかで集計結果は変わります。
元の店舗が一意でない場合には、変形後の店舗と月も重複します。集計してよい複数明細なのか、同じ帳票を二度読み込んだのかを確認してから合算へ進めてください。
表の基本操作はpandas入門、入力元で見出しが変わる場合はCSV列名の揺れを扱う方法で補えます。
参考資料
pandas.melt公式資料を2026年11月1日に確認しました。
