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 のような余分な列が生まれます。
チェックリスト #
- 先頭行は本当に列名か(余計な説明行が混じっていないか)
 - 列名の個数とデータ列の個数は一致しているか
 - 2 段以上のヘッダーになっていないか
 - 行番号・日付などを列として読ませてしまっていないか