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规模的大型数据帧时,这会变得非常棘手。不过谢谢,这是很巧妙的。