商品コード00123がCSVの読み込みで123になる場合は、列の型を確認します。集計する数量なら数値で構いませんが、商品コードは文字の並びそのものが識別子です。先頭のゼロを消すと、マスターの00123と照合できなくなります。
pandasでは読み込む時点でコード列を文字列に指定します。あとから文字列へ直しても、数値として取り込んだ時点で失われたゼロは戻りません。コードは文字列、数量は数値と列ごとに役割を分けると、その後の集計も追いやすくなります。
コード列だけ文字列にする
次は商品コードと数量だけを持つ架空のCSVです。ファイルを用意せず、StringIOという文字列をファイルのように読む道具で試します。コード列だけにdtypeを指定し、数量列は通常どおり読みます。
from io import StringIO
import pandas as pd
text = "コード,数量\n00123,2\n00007,5\n"
numeric = pd.read_csv(StringIO(text))
items = pd.read_csv(
StringIO(text),
dtype={"コード": "string"},
keep_default_na=False,
)
print("数値で読む:", numeric["コード"].tolist())
print("文字列で読む:", items["コード"].tolist())
saved = items.to_csv(index=False)
restored = pd.read_csv(
StringIO(saved),
dtype={"コード": "string"},
keep_default_na=False,
)
print("再読込:", restored["コード"].tolist())
assert restored["コード"].tolist() == ["00123", "00007"]
assert restored["数量"].sum() == 7
数値として読んだ側は123と7、文字列として読んだ側は00123と00007になります。再保存したCSVも同じ指定で読み戻すと、二つのコードがそのまま残ります。掲載例はWindows・Python 3.12.10・pandas 3.0.2で実行しました。扱ったのは上の架空データです。
実ファイルではStringIO(text)をファイルのパスへ置き換えます。文字コードがUTF-8ならencodingも明示できます。列名が「商品コード」なら、dtypeの辞書のキーも同じ名前へ変えてください。存在しない列名を指定したつもりで先へ進まず、読み込んだ列名と値を一度表示して確認します。
空欄をどの値として扱うか
文字列型を指定しても、欠損値を見つける設定は別に働きます。pandasが欠損と認識するNAなどの文字をコードとして使う場合は、既定の解釈をそのまま使えません。
この例のkeep_default_na=Falseは、その既定の解釈を止めています。空欄も文字として残す設定なので、コードを必須にする業務では別に空文字を検査します。型を指定したことと、入力が正しいことを同じ判断にしないようにします。
数量まで全部文字列にすると、合計する前に数値へ直す処理が必要です。全列を一律に変えるより、照合キーとなる列だけを先に決める方が、誤変換した場所を探しやすくなります。
保存したCSVをExcelで開くとき
CSVにはExcelのセルのような表示形式や列型を保存できません。ファイル内に00123と書いてあっても、Excelが開くときに数値と判断すると123として表示される場合があります。
pandas側の保存結果と、Excel側の取り込み方を分けて確認してください。まず保存したCSVをテキストとして見てゼロが残っているかを確認し、その後にExcelでコード列を文字列として取り込みます。この例ではExcel画面での取り込みは検証していません。
元データが123しか持っていない場合、5桁だから00123にするという処理は業務ルールの追加です。常に5桁なのか、123という別のコードが存在しないかを確かめてから採用します。
CSVの基本操作はpandas入門、数量などの集計はCSVの合計・平均を出す方法で確認できます。
参考資料
列ごとの型と欠損値の設定は、pandas.read_csv公式資料を参照しました。資料確認日は2026年11月1日です。
