Python|CSVに列があるのにKeyErrorが出るとき

Python|CSVに列があるのにKeyErrorが出るとき

記事
IT・テクノロジー
カテゴリ:Python

CSVに「金額」があるのにKeyError。読み込んだ列名に「 金額」のような空白がないか確認しましょう。

1.読み込んだ列名を確認する


今のread_csvの直後、エラー行より前に追加します。dfは自分の表データの変数名に置き換えてください。

print([repr(name) for name in df.columns])
print("修正前の行数:", len(df))
02_列名の空白を確認.png

reprは引用符付きで列名を表示します。この例の「金額」の前には半角スペースが1つあり、「金額」とは別名です。図では空白を色付けしています。

["'顧客番号'", "' 金額'", "'メモ'"]

NotebookもCSVの読込から実行し直します。encoding・sep・header・dtypeなど、今の読込設定は変えません。

2.空白が付いた1列だけ直す


「 金額」が使いたい列だと確認し、診断の後、エラー行より前に追加します。
03_対象1列だけ直す.png

old_name = " 金額"
new_name = "金額"
if not df.columns.is_unique: raise ValueError("列名が重複しています")
if new_name in df.columns: raise ValueError("変更先の列名がすでにあります")
df = df.rename(columns={old_name: new_name}, errors="raise")

old_nameは確認した実際の列名を空白ごと指定し、new_nameは使いたい列名にします。

重複・変更先の衝突・旧名の不一致はエラーで停止します。止まったら確認コードを消さず、手順1へ戻ってください。

全列へのstripは別の列まで変えたり列名を重複させたりするため、対象1列だけを変更します。

3.元の列参照と値を確認する


修正後に、もともと止まっていた列参照を実行します。

print(df["金額"].head())
print("修正後の行数:", len(df))
print(df.head())
04_値と行数を確認.png

金額・行数・番号が修正前と同じか見比べます。図の例では1200・800の2行です。head()は先頭5行までの表示で、全件確認ではありません。

変わるのは読込済みの列名だけ。元CSVの保存し直しは不要です。「0012」をすでに「12」と読み込んでいた場合は戻らないので、読込時のdtypeを別に確認します。

空白の違いが見つからないとき


無理に列名を変えず、次を確認します。

・見出しが1列につながる:区切り文字のsep
・先頭のデータが列名になる:見出し行のheader
・同じ「金額」がある:エラー行で使う表が確認したdfと同じか

複数段の見出し(MultiIndex)や.locで行を指定したときのKeyErrorは別の確認が必要です。足りない列を0で作ると集計結果が変わるため、避けましょう。

コード確認環境:Python 3.12・pandas 2.2.3/Linux。

「自分のCSVだと、どこを直せばいい?」という場合も、お気軽にご相談ください。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す