Python Pandas错误标记数据
我试图使用pandas来操纵.csv文件,但我得到这个错误:
pandas.parser.CParserError: Error tokenizing data. C error: Expected 2 fields in line 3, saw 12
我试图读pandas文档,但什么都没发现。
我的代码很简单:
path = 'GOOG Key Ratios.csv' #print(open(path).read()) data = pd.read_csv(path)
我该如何解决这个问题? 我应该使用csv
模块还是其他语言?
谢谢你们
文件来自晨星
你也可以尝试;
data = pd.read_csv('file1.csv', error_bad_lines=False)
这可能是一个问题
- 数据中的分隔符
- 第一行,@TomAugspurger刻意指出
要解决这个问题,请在调用read_csv
时指定sep
和/或header
参数。 例如,
df = pandas.read_csv(fileName, sep='delimiter', header=None)
在上面的代码中, sep
定义了你的分隔符和header=None
告诉大pandas你的源数据没有行标题/列标题。 因此,文档说:“如果文件不包含标题行,那么你应该明确地传递标题=无”。 在这种情况下,pandas自动为每个字段{0,1,2,…}创build整数字符。
根据文档,定界符的东西不应该是一个问题。 文档说“如果sep是None [未指定],将尝试自动确定这一点。” 然而我没有得到好运,包括带有明显分隔符的例子。 但是,定义sep
并不是很困难。
parsing器被文件头弄糊涂了。 它读取第一行并推断该行的列数。 但前两行不代表文件中的实际数据。
尝试使用data = pd.read_csv(path, skiprows=2)
我也有这个问题,但可能是由于不同的原因。 我的CSV中有一些尾随的逗号,里面增加了pandas试图读取的一列。 使用下面的工作,但它只是忽略了坏行:
data = pd.read_csv('file1.csv', error_bad_lines=False)
如果你想保持行的丑恶types的处理错误是做类似下面的事情:
line = [] expected = [] saw = [] cont = True while cont == True: try: data = pd.read_csv('file1.csv',skiprows=line) cont = False except Exception as e: errortype = e.message.split('.')[0].strip() if errortype == 'Error tokenizing data': cerror = e.message.split(':')[1].strip().replace(',','') nums = [n for n in cerror.split(' ') if str.isdigit(n)] expected.append(int(nums[0])) saw.append(int(nums[2])) line.append(int(nums[1])-1) else: cerror = 'Unknown' print 'Unknown Error - 222' if line != []: # Handle the errors however you want
我开始编写一个脚本来将行重新插入到DataFrame中,因为坏行将由上面代码中的variables“line”给出。 这可以通过简单地使用csv阅读器来避免。 希望pandas开发者能够更轻松地处理这种情况。
这绝对是分隔符的问题,因为大多数csv CSV都是使用sep='/t'
创buildsep='/t'
所以使用分隔符/t
使用制表符(\t)
尝试read_csv
。 所以,试着用下面的代码行打开。
data=pd.read_csv("File_path", sep='\t')
我遇到了同样的问题。 在同一个源文件上使用pd.read_table()
似乎工作。 我无法追查这个原因,但对我的情况来说这是一个有用的解决方法。 也许更有知识的人可以更多地了解为什么它的工作。
编辑:我发现,当你的文件中有一些与实际数据没有相同格式的文本时,这个错误就会出现。 这通常是页眉或页脚信息(大于一行,所以skip_header不起作用),它们不会被实际数据逗号分隔(当使用read_csv时)。 使用read_table使用制表符作为分隔符,可以绕过用户当前的错误,但引入其他错误。
我通常通过将额外的数据读入文件来解决这个问题,然后使用read_csv()方法。
确切的解决scheme可能会有所不同,具体取决于您的实际文件,但是这种方法在几种情况下适用于我
您的CSV文件可能具有可变数量的列,并且read_csv
几行推断出列数。 在这种情况下解决它的两种方法:
1)将CSV文件更改为具有最大列数的虚拟第一行(并指定header=[0]
)
2)或者使用names = list(range(0,N))
,其中N是最大列数。
我自己有几次这个问题。 几乎每一次,原因是我试图打开的文件不是一个正确保存的CSV开始。 而“恰当地”,我的意思是每行有相同数量的分隔符或列。
通常情况下,这是因为我在Excel中打开了CSV然后不正确地保存了它。 即使文件扩展名仍然是.csv,纯CSV格式已被更改。
用pandasto_csv保存的任何文件都将被正确格式化,不应该有这个问题。 但是如果你用另一个程序打开它,它可能会改变结构。
希望有所帮助。
虽然不是这个问题的情况下,这个错误也可能出现在压缩数据。 显式设置kwarg
compression
的值解决了我的问题。
result = pandas.read_csv(data_source, compression='gzip')
在尝试使用空格,逗号和引号读取制表符分隔的表格时,我遇到了类似的问题:
1115794 4218 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "" 1144102 3180 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", "" 368444 2328 "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", "" import pandas as pd # Same error for read_table counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c') pandas.io.common.CParserError: Error tokenizing data. C error: out of memory
这说明它与C语法分析引擎(这是默认的)有关。 也许改成一个python会改变任何东西
counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python') Segmentation fault (core dumped)
现在这是一个不同的错误。
如果我们继续尝试从表格中删除空格,那么python引擎的错误会再次发生变化:
1115794 4218 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","" 1144102 3180 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus","" 368444 2328 "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides","" _csv.Error: ' ' expected after '"'
而且很明显,pandas在parsing我们的行时遇到了问题。 要用python引擎parsing表,我需要事先从表中删除所有的空格和引号。 与此同时,即使用逗号排列,C语言引擎也不停地崩溃。
为了避免创build一个replace的新文件,我做了这个,因为我的表很小:
from io import StringIO with open(path_counts) as f: input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0','')) counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')
TL;博士
更改parsing引擎,尽量避免数据中的任何非定界的引号/逗号/空格。
我有一个数据集,预先存在的行号,我用index_col:
pd.read_csv('train.csv', index_col=0)
试试: pandas.read_csv(path, sep = ',' ,header=None)
有时候问题不在于如何使用python,而是使用原始数据。
我得到了这个错误信息
Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.
原来,在栏目描述中有时候会有逗号。 这意味着需要清理CSV文件或使用其他分隔符。