【问题标题】:pandas read malformed CSV熊猫读取格式错误的 CSV
【发布时间】:2017-02-13 22:00:25
【问题描述】:

我收到了一个 CSV 文件,其中 , 是用于分隔字段的分隔符,但不幸的是附加为表示小数点的符号(德语符号)。

因此,某些行将具有不同的列数。奇怪的是,excel会很好地解析/读取文件。是否也可以在熊猫中读取此类文件?到目前为止,我只得到了类似于

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有这种放纵模式吗?

【问题讨论】:

  • 你能发布一个可重现的样本数据集吗?
  • 完成。请查看编辑。
  • 每行只有一个可能受影响的列,这是对数据的准确表示吗?
  • 很遗憾没有。它可能是多个。
  • 在您的示例数据中,每个逗号后面都有一个空格作为分隔符,但对于数值没有空格。你的文件真的是这样吗?如果是这样,您应该可以使用sep=',\s' 之类的内容阅读它。

标签: python csv pandas separator malformed


【解决方案1】:

确保您的文件中没有应声明为 read_csv 的引号分隔符。

如果您的文件格式不正确,则在数学上没有确定性算法可以确定一连串带有逗号的字符是两个字段,还是一个带有逗号分隔的数字。

您将不得不编写一个预处理器,该预处理器使用一种接近您文件实际情况的临时算法来清理格式错误的数据。这可能很讨厌我假设数字后跟逗号后跟 3 位数字实际上是相同的字段以及这些修复的任何其他变体。

您也可能面临即使这样也不是确定性的情况,那么您别无他法,只能转到数据源并要求另一种文件格式进行数据修复。

要删除错误的行并加载其他行,文档中的这些参数将有所帮助:

error_bad_lines : 布尔值,默认 True Lines 字段太多 (例如,逗号太多的 csv 行)默认情况下会导致 引发异常,并且不会返回任何 DataFrame。如果为假, 那么这些“坏行”将从 DataFrame 中删除,即 回来。 (仅对 C 解析器有效)

warn_bad_lines :布尔值,默认值 True 如果 error_bad_lines 为 False,并且 warn_bad_lines 为 True,则 将输出每个“坏行”的警告。 (仅对 C 有效 解析器)。

【讨论】:

  • 不幸的是,这听起来像是一个答案。
  • @GeorgHeiler 相信我在该领域的卑微经验,不仅听起来像,而且你的大脑暂时不会接受没有其他选择:-)。如果你仔细想想,你会发现一般解决这个问题与违反停止问题是一致的。
  • 我是否可以另外要求找到(参见我上次的编辑)与 R 类似的许可模式,它只会发出警告但仍会加载部分数据?
猜你喜欢
  • 2022-01-02
  • 2015-11-14
  • 2020-05-06
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多