【问题标题】:Reading bad csv files with garbage values读取带有垃圾值的坏 csv 文件
【发布时间】:2019-05-23 14:41:23
【问题描述】:

我希望使用 pandas 读取具有以下格式的 csv 文件:

    atrrth
    sfkjbgksjg
    airuqghlerig
    Name         Roll
    airuqgorqowi
    awlrkgjabgwl
    AAA          67
    BBB          55
    CCC          07

如你所见,如果我使用pd.read_csv,我会得到相当明显的错误:

 ParserError: Error tokenizing data. C error: Expected 1 fields in line 4, saw 2

但我希望将整个数据放入一个数据框中。使用error_bad_lines = False 将删除重要的东西,只留下垃圾值

这些是下面给出的 2 个可能的列名:

Name : [Name , NAME , Name of student] 
Roll : [Rollno , Roll , ROLL]

如何做到这一点?

【问题讨论】:

  • 您的列名是保持不变还是随着 .csv 文件而变化?
  • 没有。它没有。这些列有一个可能的名称列表
  • 你能编辑你的问题并给出这些列名列表
  • [[姓名:姓名,姓名,学生姓名],[滚动:滚动,滚动,滚动]]
  • 我也会编辑问题

标签: python pandas csv tokenize parse-error


【解决方案1】:

打开 csv 文件并从列名开始的地方找到一行:

with open(r'data.csv') as fp:
    skip = next(filter(
        lambda x: x[1].startswith(('Name','NAME')),
        enumerate(fp)
    ))[0]

该值将存储在skip参数中

import pandas as pd
df = pd.read_csv('data.csv', skiprows=skip)

适用于 Python 3.X

【讨论】:

  • 数据在 csv 文件中。如何将其全部放入字符串“s”中。我这里只举了一个例子。我的数据其实很大,无法手动创建“s”
  • 我想概括一下。一开始的垃圾值可能是 3 行或 10 行。
  • 有没有办法获取所有数据,不管它是“好”还是“坏”?数据框可以稍后操作
  • 这将起作用...如果这对您有用,请投票并接受
  • 很抱歉取消选择您的答案,但鉴于新的编辑,您能告诉我新代码的外观吗?我对文件的阅读不是很流利......对此感到抱歉
【解决方案2】:

我想建议对@RahulAgarwal's answer 稍作修改/简化。您可以继续将相同的流直接加载到 pandas 中,而不是关闭并重新打开文件。您可以记录标题行并手动拆分它以提供列名,而不是记录要跳过的行数:

with open(r'data.csv') as fp:
    names = next(line for line in fp if line.casefold().lstrip().startswith('name'))
    df = pd.read_csv(fp, names=names.strip().split())

这对于具有大量垃圾行的文件具有优势。

更详细的检查可能是这样的:

def isheader(line):
    items = line.strip().split()
    if len(items) != 2:
        return False
    items = sorted(map(str.casefold, items))
    return items[0].startswith('name') and items[1].startswith('roll')

此功能将按任何顺序处理您的所有可能性,但目前还可以跳过带有空格的垃圾行。您可以将其用作过滤器:

names = next(line for line in fp if isheader(line))

【讨论】:

  • 这似乎是一个很好的答案。但我的数据集可能包含任意数量的列。你能试着看看这个新问题吗??
  • @Siddharth。一旦你收到了好的答案,你真的不应该改变你的问题的要求,更不用说接受了。而是提出一个新问题,并通知回答者以防他们感兴趣。 SO 不是帮助论坛。这是一个问答网站,未来的读者可以在这里获得类似问题的答案。
  • 我明白了。在这里有点绝望,所以开始疯狂编辑。无论如何,这是新问题:stackoverflow.com/questions/53914354/…我希望您考虑查看新问题,无需进一步更改。
  • @Siddharth。没问题。我很乐意看看。感谢收听。
【解决方案3】:

如果这确实是结构(而不​​仅仅是一个可以得到哪种垃圾的示例),您可以简单地使用skiprows 参数来指示应该跳过多少行。换句话说,你应该像这样阅读你的数据框:

import pandas as pd

df = pd.read_csv('your.csv', skiprows=3)

请注意,skiprows 可以做得更多。检查文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多