Pandas CParserError:标记d时出错

2024-06-28 20:02:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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 

当我试着读的时候,我发现了错误

^{pr2}$

如果额外的值出现在第一行,则不会出现问题。例如,如果我将值添加到同一文件的第三行,则可以正常工作

#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等有问题的行不是一个选项,这些行包含有价值的信息。在

有人知道怎么解决这个问题吗?在


Tags: 文件csvpandasthatlinesomecol2col1
3条回答

一种可能的解决方法是指定列名。请参考我对类似问题的回答:https://stackoverflow.com/a/43145539/6466550

由于我没有找到一个完全解决这个问题的答案,所以我的工作如下:我发现显式地传递带有选项names=('col1', 'col2', 'stringColumn' ... 'column25', '', '', '')的列名允许我读取文件。它迫使我读取和解析每一列,这并不理想,因为我只需要其中的一半,但至少我现在可以读取文件了。 我把namesusecols结合起来,结果不起作用,如果有人有其他解决方案,我很乐意听到。在

在我最初的帖子中,我提到不要在中使用“error_bad_lines”=False熊猫.read_csv. 我认为这样做是更恰当和优雅的解决方案。我发现这篇文章很有用。在

Can I redirect the stdout in python into some sort of string buffer?

我对答案中显示的代码做了一些改动。在

import sys
import re
from cStringIO import StringIO
import pandas as pd

fake_csv = '''1,2,3\na,b,c\na,b,c\na,b,c,d,e\na,b,c\na,b,c,d,e\na,b,c\n''' #bad data
fname = "fake.csv"
old_stderr = sys.stderr
sys.stderr = mystderr = StringIO()

df1 = pd.read_csv(StringIO(fake_csv),
                  error_bad_lines=False)

sys.stderr = old_stderr 
log = mystderr.getvalue()
isnum = re.compile("\d+")

lines_skipped_log = [
    isnum.findall(i) + [fname]\
    for i in log.split("\n") if isnum.search(i)
        ]

columns=["line_num","flds_expct","num_fields","file"]
lines_skipped_log.insert(0,columns)

从那里你可以用lines_skipped_log做任何你想做的事情,比如输出到csv,创建一个数据帧等等

也许你有一个满是文件的目录。您可以从每个日志中创建pandas数据帧的列表并进行连接。从那里你将有一个日志,哪些行被跳过,哪些文件在你的指尖(字面上!)。在

相关问题 更多 >