【问题标题】:Python pandas delimiter misprint - double signPython pandas 定界符打印错误 - 双符号
【发布时间】:2018-12-05 09:28:30
【问题描述】:

这是我打开文件的代码:

df = pd.read_csv(path_df, delimiter='|')

我收到错误:错误标记数据。 C 错误:预计第 13571 行中有 5 个字段,看到 6

当我检查这一行时,我发现有一个打印错误,并且有 3 个标志“|||”而不是一个。我更愿意将双标和三标视为一个。可能还有其他解决方案。

我该如何解决这个问题?

【问题讨论】:

  • 是打印错误,分隔符增加了三倍,还是格式错误的文件,其中| 是该字段的值并且在写入时没有被转义?
  • 问题指的是由于某种原因分隔符加倍的一般情况。在这里看不到打印错误和格式错误的文件之间的区别。解决方案会有所不同吗?

标签: python pandas csv delimiter


【解决方案1】:

使用正则表达式分隔符[|]+ - 一个或多个|

import pandas as pd

temp=u"""a|b|c
ss|||s|s
t|g|e"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep="[|]+",engine='python')

print (df)
    a  b  c
0  ss  s  s
1   t  g  e

【讨论】:

  • 没有看到数据很尴尬,但是如果他期待 5 个字段,而 ||| 意味着他看到了 6 个字段,这是否意味着这是由应该包含 | 的字段引起的特点?这意味着将||| 视为一个分隔符会使列在另一个方向上错位。
  • 如果你有一行1|2|3|4|5你有5列,如果你有1|2|3|||5`你有6列sep='|'和4列sep='[|]+'
  • @Stael - 是的,我明白了。熊猫尝试从标题中计算列,我认为如果数据从 ss|||s|s 更改为 ss||s,我认为 sep='|' 工作得很好
  • 感谢您指出这一点。我错了,在这个特定的问题中,问题是不同的。有一个 |在文本中签名:“这是一个 | 示例”。
【解决方案2】:

另一种定义分隔符的方法是在 pandas 中读取 CSV 时使用 sep

df = pd.read_csv(path_df, sep=r'\|+', engine='python')

每当您发现“C 错误”时,都需要通过在参数中指定 engine='python' 来强制使用 python 引擎。

【讨论】:

  • @coldspeed,感谢您的编辑。我没有注意到 |||在问题中。
  • 是的,否则 sepdelimiter 做同样的事情。不要猝不及防,请仔细阅读问题。
【解决方案3】:

我的怀疑是,如果该字段应该包含值“|”,这将是由于文件写入不正确造成的但不知何故写错了(csv通常会写像1|2|3|"|"|5这样的一行),但如果写错了没有任何转义,就会导致这个问题。

在那种情况下,我认为你不能用 pandas 解决这个问题,因为问题是 csv 格式错误。

如果是一次性的,您可以先编辑文件,也许要替换所有“|||”用“||” - 但同样,这可能会产生意想不到的后果。我以前也遇到过这个问题,我认为没有比手动编辑文件更好的方法了(至少 pandas 会为您提供要查看的行号!)

另一方面,如果它真的只是重复的字符打印错误,那么另一个答案就可以了。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2015-05-20
    • 2022-10-15
    • 2015-09-03
    相关资源
    最近更新 更多