【发布时间】:2016-08-23 05:57:47
【问题描述】:
我有一个包含 25 列的大型 csv 文件,我想将其读取为 pandas 数据框。我正在使用pandas.read_csv()。
问题是有些行有额外的列,像这样:
col1 col2 stringColumn ... col25
1 12 1 str1 3
...
33657 2 3 str4 6 4 3 #<- that line has a problem
33658 1 32 blbla #<-some columns have missing data too
当我尝试阅读它时,我得到了错误
CParserError: Error tokenizing data. C error: Expected 25 fields in line 33657, saw 28
如果额外的值出现在第一行中,则不会发生此问题。例如,如果我将值添加到同一文件的第三行,它可以正常工作
#that example works:
col1 col2 stringColumn ... col25
1 12 1 str1 3
2 12 1 str1 3
3 12 1 str1 3 f 4
...
33657 2 3 str4 6 4 3 #<- that line has a problem
33658 1 32 blbla #<-some columns have missing data too
我的猜测是,pandas 会检查前 (n) 行以确定列数,如果之后有额外的列,它会在解析它时出现问题。
跳过像建议的here 这样的违规行不是一种选择,这些行包含有价值的信息。
有人知道解决这个问题的方法吗?
【问题讨论】:
-
您希望这些行如何存储和表示?例如,您是在 25 列还是 28 列之后?
-
我只对 25 列中的大约一半感兴趣。额外列中的值我不感兴趣。
-
列数是否固定?即它总是 28
-
你不能只做
pd.read_csv(file_path, delim_whitespace=True, usecols=np.arange(25))吗? -
我尝试了
data = pd.read_csv(f, skiprows=2, delimiter="\t", dtype='str', index_col=0, usecols=np.arange(25))并得到了ValueError: Usecols do not match names。 (字段由 \t 分隔,并且在开头多出一行,因此参数skiprows和delimiter