read_csvで列名がずれてValueErrorになる

Prep

read_csvで列名がずれてValueErrorになる

作成日: 最終更新: 読了時間: 1 分

CSV を読み込むときに次のようなエラーが出ることがあります。

ValueError: Length mismatch: Expected axis has 6 elements, new values have 5 elements

あるいは

pandas.errors.ParserError: Expected 1 lines in header, saw 2

これは ヘッダー行の扱いが実際のファイル構造と一致していない 場合に発生します。
以下のようなパターンで起きやすいので、順番に確認してみましょう。


✅ パターン 1: ヘッダーが存在しない CSV をデフォルト設定で読んでいる #

import pandas as pd

df = pd.read_csv("no_header.csv", header=None)
df.columns = ["id", "name", "age", "score"]

ヘッダーが無い場合は header=None を指定し、列名を手動で設定します。
Excel の「テキスト (タブ区切り)」などで書き出すとヘッダーが省かれているケースが多いです。


✅ パターン 2: ファイルの冒頭に説明行や空行が含まれている #

df = pd.read_csv("report.csv", skiprows=2)

ヘッダーの前に説明文が書かれている場合は、skiprows= でスキップします。
空行が混入しているときは skip_blank_lines=True(デフォルト値)を確認しつつ、
必要に応じて comment="#" などでコメント行を除外してください。


✅ パターン 3: 2 行ヘッダーや複数ヘッダーを持つ #

df = pd.read_csv("multi_header.csv", header=[0, 1])
df.columns = ["_".join(tuple(filter(None, col))) for col in df.columns]

金融機関や BI ツールから出力された CSV では、上段にカテゴリ・下段に詳細名という
多段ヘッダー になっている場合があります。header=[0,1] のように読み込み、
必要に応じてフラット化すれば扱いやすくなります。


✅ パターン 4: インデックス列や日時列が勝手に列名扱いされている #

df = pd.read_csv("sales.csv", index_col=0)

左端に通し番号や日付が入っている場合、index_col を指定して行インデックスとして扱います。
これを指定しないと列数の不一致や Unnamed: 0 のような余分な列が生まれます。


チェックリスト #

  1. 先頭行は本当に列名か(余計な説明行が混じっていないか)
  2. 列名の個数とデータ列の個数は一致しているか
  3. 2 段以上のヘッダーになっていないか
  4. 行番号・日付などを列として読ませてしまっていないか

参考 #