2.3.3
read_csvで列名がずれてValueErrorになる
まとめ
pd.read_csv()でヘッダー行と列数が一致しないValueErrorを解決する。header・skiprows・index_col引数でファイル構造に合わせた読み込みを行う。- CSVの先頭に説明行がある、ヘッダーがない、多段ヘッダーがあるときに参照する。
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 をデフォルト設定で読んでいる #
| |
ヘッダーが無い場合は header=None を指定し、列名を手動で設定します。
Excel の「テキスト (タブ区切り)」などで書き出すとヘッダーが省かれているケースが多いです。
✅ パターン 2: ファイルの冒頭に説明行や空行が含まれている #
| |
ヘッダーの前に説明文が書かれている場合は、skiprows= でスキップします。
空行が混入しているときは skip_blank_lines=True(デフォルト値)を確認しつつ、
必要に応じて comment="#" などでコメント行を除外してください。
✅ パターン 3: 2 行ヘッダーや複数ヘッダーを持つ #
| |
金融機関や BI ツールから出力された CSV では、上段にカテゴリ・下段に詳細名という
多段ヘッダー になっている場合があります。header=[0,1] のように読み込み、
必要に応じてフラット化すれば扱いやすくなります。
✅ パターン 4: インデックス列や日時列が勝手に列名扱いされている #
| |
左端に通し番号や日付が入っている場合、index_col を指定して行インデックスとして扱います。
これを指定しないと列数の不一致や Unnamed: 0 のような余分な列が生まれます。
チェックリスト #
- 先頭行は本当に列名か(余計な説明行が混じっていないか)
- 列名の個数とデータ列の個数は一致しているか
- 2 段以上のヘッダーになっていないか
- 行番号・日付などを列として読ませてしまっていないか