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でもなんとかできる方法はありそう。
以上。