如何使用熊猫从csv查看单行

时间:2019-07-31 17:07:40

标签: python pandas csv parse-error

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

我去了使用Pandas将2008-20011 csv读取到一个数据帧,并且收到了parseError消息,指出在csv的某行中有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个字段。我还想确保自己不会混淆索引,所以我在前后打印了一些;他们每个人都有相同数量的字段。谁能帮助我了解发生了什么事?

2 个答案:

答案 0 :(得分:0)

我同意这令人困惑。为了弄清楚到底发生了什么,我必须不使用熊猫来读取文件:

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)

,您正在做正确的事

答案 1 :(得分:0)

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

  

如何使用熊猫从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]]