LoginSignup
3
3

More than 1 year has passed since last update.

Pandas read_csvで読み込みエラーになる場合の対処

Last updated at Posted at 2022-01-07

read_csvでtokenizing errorがでるケース

sepで区切り文字を指定した際、元データが行によって列数が異なる場合にエラーになる

以下のようなデータを読み込む場合

sample.tsv
AA\tAA\tAA
BB\tBB\tBB\tBB
CC\tCC\tCC\tCC
DD\tDD\tDD\tDD
EE\tEE\tEE\tEE

エラー例

import pandas as pd

df = pd.read_csv('data/src/sample.tsv', sep='\t, header=None)

Error tokenizing data. C error: Expected 4 fields in line 2, saw 11

原因

エラー内容の通り、行によって列数にばらつきがあると期待どおりでないとエラーになる

対処

1. read_csvのskiprowsを使う

列数が異なるデータが何行目にあるかわかっており、
かつ不要であれば読み飛ばせば良い

sample.tsv
A\tA\tA
B\tB\tB\tB
C\tC\tC\tC
D\tD\tD\tD
E\tE\tE\tE
import pandas as pd

df = pd.read_csv('data/src/sample.tsv', sep='\t, header=None, skiprows=[0])
print(df)
# 0  BB  BB  BB  BB
# 1  CC  CC  CC  CC
# 2  DD  DD  DD  DD
# 3  EE  EE  EE  EE

2.read_csvでは対処せず、読み込後に処理を行う

列数が異なるデータの行も利用したい場合は、
一度区切りを使わずに読み込んでからstr.splitで処理する

sample.tsv
AA\tAA\tAA\tAA
BB\tBB\tBB\tBB
CC\tCC\tCC
DD\tDD\tDD\tDD
EE\tEE\tEE\tEE
import pandas as pd

df = pd.read_csv('data/src/sample.tsv', header=None)
print(df)
# 0  AA\tAA\tAA\tAA
# 1  BB\tBB\tBB\tBB
# 2  CC\tCC\tCC
# 3  EE\tEE\tEE\tEE

df = df[0].str.split('\t', expand=True)
print(df)
# 0  AA  AA  AA  AA
# 0  BB  BB  BB  BB
# 1  CC  CC  CC  NaN
# 2  DD  DD  DD  DD
# 3  EE  EE  EE  EE

expand=Trueにすることで、データフレームの列として拡張される。

個人的に2番の方法試す前に、read_csvでなんとかできないか色々試してハマって取り急ぎの対処。
read_csvでもなんとかできる方法はありそう。

以上。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3