Python ValueError:通过块将数据导入pandas.csv_reader()中
我有一个大的Python ValueError:通过块将数据导入pandas.csv_reader()中,python,pandas,chunking,Python,Pandas,Chunking,我有一个大的gzip文件,我想把它导入到熊猫数据帧中。不幸的是,该文件的列数不均匀。数据的格式大致如下: .... Col_20: 25 Col_21: 23432 Col22: 639142 .... Col_20: 25 Col_22: 25134 Col23: 243344 .... Col_21: 75 Col_23: 79876 Col25: 634534 Col22: 5 Col24: 73453 .... Col_20: 25
gzip
文件,我想把它导入到熊猫数据帧中。不幸的是,该文件的列数不均匀。数据的格式大致如下:
.... Col_20: 25 Col_21: 23432 Col22: 639142
.... Col_20: 25 Col_22: 25134 Col23: 243344
.... Col_21: 75 Col_23: 79876 Col25: 634534 Col22: 5 Col24: 73453
.... Col_20: 25 Col_21: 32425 Col23: 989423
.... Col_20: 25 Col_21: 23424 Col22: 342421 Col23: 7 Col24: 13424 Col 25: 67
.... Col_20: 95 Col_21: 32121 Col25: 111231
作为测试,我尝试了以下方法:
import pandas as pd
filename = `path/to/filename.gz`
for chunk in pd.read_csv(filename, sep='\t', chunksize=10**5, engine='python'):
print(chunk)
以下是我得到的回报:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/io/parsers.py", line 795, in __next__
return self.get_chunk()
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/io/parsers.py", line 836, in get_chunk
return self.read(nrows=size)
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/io/parsers.py", line 815, in read
ret = self._engine.read(nrows)
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/io/parsers.py", line 1761, in read
alldata = self._rows_to_cols(content)
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/io/parsers.py", line 2166, in _rows_to_cols
raise ValueError(msg)
ValueError: Expected 18 fields in line 28, saw 22
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/nfs/sw/python/python-3.5.1/lib/python3.5/site packages/pandas/io/parsers.py”,第795行,下一页__
返回self.get_chunk()
get_块中的文件“/nfs/sw/python/python-3.5.1/lib/python3.5/site packages/pandas/io/parsers.py”,第836行
返回self.read(nrows=size)
文件“/nfs/sw/python/python-3.5.1/lib/python3.5/site packages/pandas/io/parsers.py”,第815行,已读
ret=自身。\发动机读取(nrows)
文件“/nfs/sw/python/python-3.5.1/lib/python3.5/site packages/pandas/io/parsers.py”,第1761行,已读
alldata=self.\u行\u到\u列(内容)
文件“/nfs/sw/python/python-3.5.1/lib/python3.5/site packages/pandas/io/parsers.py”,第2166行,在行到列
提升值错误(msg)
ValueError:第28行中预期有18个字段,saw 22
如何为pandas分配一定数量的列。请阅读\u csv()?您也可以尝试以下方法:
for chunk in pd.read_csv(filename, sep='\t', chunksize=10**5, engine='python', error_bad_lines=False):
print(chunk)
error\u bad\u line
会跳过错误行。我会看看是否能找到更好的替代方案
编辑:为了维护被error\u bad\u lines
跳过的行,我们可以检查错误并将其添加回数据帧
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'
您的问题是一些格式错误的csv,它与预先分配列数无关,您需要进行一些额外的调试,以找到格式错误的特定文件和行,您应该发布到csv的链接或复制csv的小样本error@EdChum它不仅仅是一行——这个文件实际上包含了像这样的每一行。有些行可能有20列,接下来是28列。正确的方法是什么?如果没有看到具体的数据,我不能回答假设性的问题,发布数据。它应该有规则的分隔符和形式,如果没有,那么你需要清理数据first@EdChum对不起,你说得对。数据是以制表符分隔的文本格式,但每行的列数不一致。但它始终是以制表符分隔的文本。我提出这个问题的动机是,我该如何处理这个问题?特别是对于非常大的数据文件,例如100s的GB?它是固定宽度的吗?文件的大小与此无关,您有一个格式错误的数据问题。这个文件是如何生成的?谢谢你的帮助。是的,我认为
error\u bad\u line
删除了我迫切需要的数据…我发现了一个肮脏的黑客让我编辑答案,可能不理想,但应该这样做。问题是在处理GB规模的大型数据帧时,这会变得非常棘手。不过谢谢,这是很巧妙的。