【问题标题】:How to view single row from csv with pandas如何使用熊猫查看csv中的单行
【发布时间】:2019-07-31 17:07:40
【问题描述】:

我从https://www.kaggle.com/currie32/crimes-in-chicago得到这个 csv 文件

我使用 Pandas 将 2008-20011 csv 读取到数据帧中,并收到一条 parseError 消息,指出在 csv 的某一行中,在预期的 23 个字段中找到了 41 个字段。

ParserError:标记数据时出错。 C 错误:预计第 1149094 行中有 23 个字段,看到 41

我使用此命令通过简单地跳过任何错误行来读取 csv:

CHIcrime_df2 = pd.read_csv(path, error_bad_lines=False)

按计划进行,但我想知道所有这些额外字段是什么,所以我使用 csv.reader 读取文件

with open('path') as data: reader=csv.reader(data) interestingrows=[row for idx, row in enumerate(reader) if idx==1149094]

我预计会有 41 个字段,但有 23 个。我还想确保我没有混淆索引,所以我在前后打印了一些;他们每个人都有相同数量的字段。谁能帮我理解这是怎么回事?

【问题讨论】:

  • 您似乎在行号上打错了字。原始错误消息引用行1149094。您查看该行的代码示例有idx==1149049。你已经交换了最后两位数字。
  • 感谢@DaveCosta,我认为这只是我的问题中的错字,而不是代码。

标签: python pandas csv parse-error


【解决方案1】:

David Makovoz 已经解释了这个问题,所以我只回答你的问题:

如何使用 pandas 从 csv 中查看单行

如果错误发生在第 n 行 (1149094),则跳过 n-1 行并仅读取 1 行:

df = pd.read_csv('Chicago_Crimes_2008_to_2011.csv', skiprows=1149093, nrows=1, header=None)

结果:

>>> print(df.values)
[[2023517 7818233 'HS626859' '11/21/2010 11:00:00 PM'
  '079XX S JEFFERY BLVD' 460 'BATTERY' 'SIMPLE' 'STREET' False False 414
  4.0 8.0 46.0 '08B' 1190912.0 1852820.0 2010 '02/04/2016 06:33:39 AM'
  41.751151039 '-87.1:00:00 AM' '031XX W LEXINGTON ST' 810 'THEFT'
  'OVER $500' 'STREET' False False 1134 11.0 24.0 27.0 6 nan nan 2008
  '08/17/2015 03:03:40 PM' nan nan nan]]

【讨论】:

    【解决方案2】:

    我同意这令人困惑。为了弄清楚发生了什么,我不得不在不使用 pandas 的情况下读取文件:

    import zipfile
    import pandas as pd
    archive = zipfile.ZipFile(fname, 'r')
    csvfile = archive.open('Chicago_Crimes_2008_to_2011.csv', 'r')
    bdata = csvfile .readlines()
    data = [line.decode() for line in bdata]
    data_df = pd.DataFrame.from_records(data[1:]) #the first line is the header
    

    到目前为止,一切都很好。

    data_df.shape
    >>(2688711, 41)
    

    好的,有一行41列

    data_df.dropna()
    >>1149092   2023517 7818233 HS626859    11/21/2010 11:00:00 PM  079XX S JEFFERY BLVD ...
    

    所以它是第 1149093 行不计算标题和 1149094 计算标题。

    print (data[1149093])
    >>['2023517', '7818233', 'HS626859', '11/21/2010 11:00:00 PM', '079XX S JEFFERY BLVD', '0460', 'BATTERY', 'SIMPLE', 'STREET', 'False', 'False', '414', '4.0', '8.0', '46.0', '08B', '1190912.0', '1852820.0', '2010', '02/04/2016 06:33:39 AM', '41.751151039', '-87.1:00:00 AM', '031XX W LEXINGTON ST', '0810', 'THEFT', 'OVER $500', 'STREET', 'False', 'False', '1134', '11.0', '24.0', '27.0', '06', '', '', '2008', '08/17/2015 03:03:40 PM', '', '', '']
    

    所以,看起来像两行写成一行,有一些重叠。 但是,底线是,忽略该行 CHIcrime_df2 = pd.read_csv(path, error_bad_lines=False)

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2017-07-28
      相关资源
      最近更新 更多