業務で以下のように行ごとの要素数が一定でないcsvの読み込みで少しハマったので解決法をメモしておきます。
<イメージ>
A列 B列 C列 D列
1a, a, a
2b, b, b, b
3c, c, c
<エラーメッセージ>
pd.read_csv( ‘xxxx.tsv’, sep=’\t’, header=False )
#=> CParserError: Error tokenizing data. C error: Expected 4 fields in line 58, saw 5
エラーの内容は読み込んだcsvファイルの58行目で4列だと思っていたのに5列目があるやんけ!みたいな内容。
要はpandasが自動で判定した列数と実際の列数に差異がある場合に起こるエラーなので、read_csv()の引数のnamesで列数を指定してあげれば通るみたいです。仮に読み込むcsvの列が最大で10列あるとすると以下のように記述すればよいです。
# カラム名用のリストを作る col_names = [ 'c{0:02d}'.format(i) for i in range(10) ] #=> ['c00', 'c01', 'c02', 'c03', 'c04', 'c05', 'c06', 'c07', 'c08', 'c09'] # 読み込む pd.read_csv('xxxx.tsv', sep='\t', names=col_names)
エラーの原因としてはpandasのread_csv()の列数の推論機能が原因ですが、こういう場合は大抵元のcsvに一部へんなデータがあるカンマの区切りがおかしいみたいな不備があるケースもあるので、csvの中身をメモ帳とかSAKURAみたいなテキストエディタ一度確認してみても良いかもしれません。
関連記事:pandasでcsv読み込み時にインデックスや列がズレる原因と対処法
関連記事:pandasでcsv読み込み時に「UnicodeDecodeError」が出る際の解決方法
参考:http://blog.mwsoft.jp/article/113600124.html
コメント