商品コードNAが空欄と同じ扱いになるなら、読み込み時の欠損値設定を確認します。pandasではNAなどの文字列が既定で欠損値として解釈されます。数量の未入力を探すには便利でも、NAというコードが実在する一覧では区別が必要です。
文字列型を指定すればすべて残る、というわけでもありません。列の型と欠損値の認識は別の設定です。既定の欠損表現を止めたうえで、その列で空欄とする値だけを指定します。
NAと空欄を並べて読む
次の架空CSVには、NA、空欄、A01の三つのコードがあります。既定の読み方と、空文字だけを欠損とする読み方を比べます。StringIOを使うので、練習用ファイルは要りません。
from io import StringIO
import pandas as pd
text = "コード,数量\nNA,1\n,2\nA01,3\n"
default = pd.read_csv(
StringIO(text), dtype={"コード": "string"}
)
specified = pd.read_csv(
StringIO(text),
dtype={"コード": "string"},
keep_default_na=False,
na_values={"コード": [""]},
)
print("既定の欠損判定:", default["コード"].isna().tolist())
print("指定後の欠損判定:", specified["コード"].isna().tolist())
print("確認用表示:", specified["コード"].fillna("(空欄)").tolist())
assert specified["コード"].iloc[0] == "NA"
assert specified["コード"].isna().tolist() == [False, True, False]
既定では最初の二件が欠損になります。指定後は二件目だけが欠損になり、NAは文字として残ります。fillnaは最後の確認用表示だけに使っており、読み込んだ表の欠損値を一律に書き換える処理ではありません。
掲載コードはWindows・Python 3.12.10・pandas 3.0.2で実行し、この三件の判定を確認しました。実ファイルへ移すときも、NAがある行と本当の空欄がある行を含む小さな入力から比べると、設定の意味を追えます。
空文字と空白文字を混ぜない
この指定で欠損にするのは空文字です。半角スペースだけの値や、全角スペース、ハイフンなどを自動で同じ意味にはしていません。
入力元が未入力をスペースで出すなら、前後の空白を取るのか、そのまま不正値として返すのかを決めます。コードの前後に空白が意味を持つ仕様も考えられるため、表全体へ無条件にstripをかける前に、列の定義を確かめてください。
na_valuesには列ごとの辞書を渡せます。「コード」の空文字は欠損、「備考」のNAはそのまま、というように、意味が異なる列を分けて扱えます。入力元がNULLや未設定という文字も使うなら、その語を欠損と認める根拠を確認してから追加します。
欠損の件数を処理前に残す
コードが欠損した行は、マスターとの照合へそのまま流さず、行を特定できる番号とともに確認へ回します。欠損を空文字や0へ置き換えて続けると、入力の不備を見つけにくくなります。
一方、数量の空欄を0と数えるかどうかは別の判断です。コード列の欠損ルールを整えたことで、数量や日付まで正しいと判断しないようにします。読み込み前後で総件数と列ごとの欠損件数を比べると、意図しない解釈にも気づけます。
文字列や数値の読み込みはpandas入門、空欄のある数値を合計・平均するときの違いはCSV集計の基本へつながります。
設定の確認先
pandas.read_csv公式資料のdtype、keep_default_na、na_valuesを確認しました。資料確認日は2026年11月1日です。欠損を何とみなすかは入力元の仕様に合わせて決めてください。
