如何使用 pandas 从 csv 查看单行
How to view single row from csv with pandas
我从 https://www.kaggle.com/currie32/crimes-in-chicago
得到了这个 csv 文件
我使用 Pandas 将 2008-20011 csv 读取到数据帧,我收到一条 parseError 消息,指出在 csv 的特定行中发现了 41 个字段,而预期的字段是 23 个。
ParserError: Error tokenizing data. C error: Expected 23 fields in line 1149094, saw 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 个。我也想确保我没有混淆索引,所以我在前后打印了一些;他们每个人都有相同数量的字段。任何人都可以帮助我了解这是怎么回事吗?
我同意这令人困惑。为了弄清楚发生了什么,我不得不在不使用 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 行不计算 header,第 1149094 行计算 header。
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 0', '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)
已经解释了这个问题,所以我就直接回答你的问题:
How to view single row from csv with pandas
如果错误发生在第 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 0' 'STREET' False False 1134 11.0 24.0 27.0 6 nan nan 2008
'08/17/2015 03:03:40 PM' nan nan nan]]
我从 https://www.kaggle.com/currie32/crimes-in-chicago
得到了这个 csv 文件我使用 Pandas 将 2008-20011 csv 读取到数据帧,我收到一条 parseError 消息,指出在 csv 的特定行中发现了 41 个字段,而预期的字段是 23 个。
ParserError: Error tokenizing data. C error: Expected 23 fields in line 1149094, saw 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 个。我也想确保我没有混淆索引,所以我在前后打印了一些;他们每个人都有相同数量的字段。任何人都可以帮助我了解这是怎么回事吗?
我同意这令人困惑。为了弄清楚发生了什么,我不得不在不使用 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 行不计算 header,第 1149094 行计算 header。
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 0', '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)
How to view single row from csv with pandas
如果错误发生在第 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 0' 'STREET' False False 1134 11.0 24.0 27.0 6 nan nan 2008
'08/17/2015 03:03:40 PM' nan nan nan]]