Pandas读取格式错误的CSV文件

3

我收到了一个CSV文件,其中,是用来分隔字段的分隔符,但不幸的是,它还作为表示小数点(德国表示法)的符号。

因此,有些行将具有不同数量的列。奇怪的是,Excel可以解析/读取文件。在pandas中是否也可以读取这样的文件?到目前为止,我只得到了类似于

Error tokenizing data. C error: Expected 97 fields in line 3, saw 98

编辑

这里是一个最简示例:

pd.read_csv(os.path.expanduser('~/Downloads/foo.csv'), sep=',', decimal=',')

使用 ~/Downloads/foo.csv 文件并包含以下内容

first, number, third
some, 1, other
foo, 1.5, bar
baz, 1,5, some

当我在R中加载数据时
See spec(...) for full column specifications.
Warnung: 1538 parsing failures.
row col   expected      actual
  1  -- 93 columns 97 columns 
  2  -- 93 columns 98 columns 
  3  -- 93 columns 97 columns 
  4  -- 93 columns 102 columns
  5  -- 93 columns 99 columns 

在pandas中是否有这样一种宽容模式?

3
你能否提供一个可重现的样本数据集? - MaxU - stand with Ukraine
done. please see the edit. - Georg Heiler
这是否准确地表示了数据,即每行只有一个可能受影响的列? - DSM
2
在你的示例数据中,每个逗号后面都有一个空格作为分隔符,但对于数字值则没有空格。你的文件实际上是这样的吗?如果是这样的话,你应该可以使用类似于sep=',\s'的方法来读取它。 - root
很好的想法。不幸的是,假设列是完全分开的这个假设在真实数据中并不成立。 - Georg Heiler
显示剩余7条评论
1个回答

3
请确保您的文件中没有引号分隔符需要在read_csv中声明。
如果您的文件格式不正确,那么数学上就没有确定性算法可以决定逗号后面的一系列字符是两个字段还是只是一个带有逗号分隔数字的字段。
您需要编写一个预处理器来清理格式不正确的数据,使用特定的算法接近于您文件的实际情况。这可能会很棘手,例如:“我假设数字后跟着逗号再跟着3个数字实际上是同一个字段”,以及其他任何这些修复的变化。
您也可能会遇到即使使用这种方式仍然无法确定的情况,那么您就只能去数据源并要求另一种文件格式或数据修复。
为了删除错误行并加载其他行,文档中的这些参数将有所帮助:
error_bad_lines:布尔值,默认为True。有太多字段的行(例如具有太多逗号的csv行)将默认导致引发异常,并且不返回任何DataFrame。如果为False,则将从返回的DataFrame中删除这些"bad lines"。(仅与C解析器有效)
warn_bad_lines:布尔值,默认为True。如果error_bad_lines为False,且warn_bad_lines为True,则会针对每个"bad line"输出一条警告。(仅与C解析器有效)

不幸的是,这听起来像一个答案。 - Georg Heiler
1
@GeorgHeiler 相信我的谦虚经验,不仅听起来像,而且你的思维在一段时间内不会接受没有替代方案 :-)。如果你再多考虑一下,你会发现通用解决方法与违反停机问题是相一致的。 - Zeugma
我可以额外询问一下(请参见我的最后编辑),是否可以找到类似于R的宽松模式,仅会抛出警告但仍会加载部分数据? - Georg Heiler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接