Pandas读取带有双引号的CSV文件时出现错误
Pandas读取带有双引号的CSV文件时出现错误
我已经阅读了所有相关的主题,比如这个、这个和这个,但是无法找到解决方案。
我有一个输入的csv文件,格式如下:
ItemId,Content i0000008,{"Title":"Edison Kinetoscopic Record of a Sneeze","Year":"1894","Rated":"N/A"} i0000010,{"Title":"Employees, Leaving the Lumiére, Factory","Year":"1895","Rated":"N/A"}
我尝试了几种不同的方法,但都无法使其正常工作。我想要将这个csv文件读入到一个Dataframe中,格式如下:
ItemId Content -------- ------------------------------------------------------------------------------- i0000008 {"Title":"Edison Kinetoscopic Record of a Sneeze","Year":"1894","Rated":"N/A"} i0000010 {"Title":"Employees, Leaving the Lumiére, Factory","Year":"1895","Rated":"N/A"}
使用以下代码(Python 3.9):
df = pd.read_csv('test.csv', sep=',', skipinitialspace = True, quotechar = '"')
据我理解,字典列内的逗号和引号内的逗号被视为普通的分隔符,因此会引发以下错误:
pandas.errors.ParserError: Error tokenizing data. C error: Expected 4 fields in line 3, saw 6
是否可能产生所需的结果?谢谢。
Pandas读取带有双引号的CSV文件时出现错误的原因是因为该文件中的某些值包含了多次使用的分隔符,这导致Pandas无法正常读取。然而,可以使用Python进行处理,将其转换为Pandas DataFrame。以下是解决方法:
首先,我们定义一个函数splitValues(x),该函数用于将每行数据拆分为两部分:第一部分是分隔符之前的内容,第二部分是分隔符之后的内容。然后,我们使用Python的open()函数打开文件,并读取文件的第一行作为列名。接着,我们使用strip()函数去除列名中的空格,并使用split()函数将列名按照逗号分隔成列表。最后,我们使用pd.DataFrame()函数将处理后的数据转换为Pandas DataFrame。
下面是完整的代码:
def splitValues(x): index = x.find(',') return x[:index], x[index+1:].strip() import pandas as pd data = open('file.csv') columns = next(data) columns = columns.strip().split(',') df = pd.DataFrame(columns=columns, data=(splitValues(row) for row in data))
运行以上代码后,输出结果如下:
ItemId Content 0 i0000008 {"Title":"Edison Kinetoscopic Record of a Sneeze","Year":"1894","Rated":"N/A"} 1 i0000010 {"Title":"Employees, Leaving the Lumiére, Factory","Year":"1895","Rated":"N/A"}
通过以上方法,我们成功将带有双引号的CSV文件转换为了Pandas DataFrame,解决了Pandas读取该文件时出现的错误。
问题出现的原因是在Content
列中的逗号被解释为分隔符。可以通过使用pd.read_fwf
手动设置要拆分的字符数量来解决这个问题。解决方法是使用pd.read_fwf
函数读取CSV文件,并通过设置colspecs
参数来指定每列的起始和结束位置。最后,通过设置header
参数为0和names
参数来指定列名。
解决方法如下:
df = pd.read_fwf('test.csv', colspecs=[(0, 8),(9,100)], header=0, names=['ItemId', 'Content'])
这个解决方法不完全正确,因为它只能读取字典中的第一个键值对。对于每一行,它没有产生期望的结果,只读取了字典中的第一个键值对。但是,可以通过以下更简单的方法来解决问题。
好的解决方法如上所述。接下来,问题的下一步是按照展开JSON的步骤进行操作,然后数据框就会变得正确。
这个解决方法很好,但是实际的CSV文件有一个更大(且长度可变)的JSON列,所以我猜这个(9,100)的列范围可能需要猜测,对吗?
只要第一列中的字符数量保持一致,它就可以正常工作,这似乎是可以的。你可以将100更改为大于最长行中字符数量的任意数字。
最终结果如下:
ItemId | Content | |
---|---|---|
0 | i0000008 | {"Title":"Edison Kinetoscopic Record of a Sneeze","Year":"1894","Rated":"N/A"} |
1 | i0000010 | {"Title":"Employees, Leaving the Lumiére, Factory","Year":"1895","Rated":"N/A"} |