Pandas read_csv espera un número incorrecto de columnas, con un archivo csv irregular

Tengo un archivo csv que tiene unos pocos cientos de filas y 26 columnas, pero las últimas columnas solo tienen un valor en unas pocas filas y están hacia la mitad o al final del archivo. Cuando bash leerlo utilizando read_csv (), aparece el siguiente error. “ValueError: esperando 23 columnas, obtuvo 26 en la fila 64”

No puedo ver dónde declarar explícitamente la cantidad de columnas en el archivo, o cómo determina cuántas columnas cree que debería tener el archivo. El vertedero esta abajo

In [3]: infile =open(easygui.fileopenbox(),"r") pledge = read_csv(infile,parse_dates='true') --------------------------------------------------------------------------- ValueError Traceback (most recent call last)  in () 1 infile =open(easygui.fileopenbox(),"r") 2 ----> 3 pledge = read_csv(infile,parse_dates='true') C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in read_csv(filepath_or_buffer, sep, dialect, header, index_col, names, skiprows, na_values, thousands, comment, parse_dates, keep_date_col, dayfirst, date_parser, nrows, iterator, chunksize, skip_footer, converters, verbose, delimiter, encoding, squeeze) 234 kwds['delimiter'] = sep 235 --> 236 return _read(TextParser, filepath_or_buffer, kwds) 237 238 @Appender(_read_table_doc) C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in _read(cls, filepath_or_buffer, kwds) 189 return parser 190 --> 191 return parser.get_chunk() 192 193 @Appender(_read_csv_doc) C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in get_chunk(self, rows) 779 msg = ('Expecting %d columns, got %d in row %d' % 780 (col_len, zip_len, row_num)) --> 781 raise ValueError(msg) 782 783 data = dict((k, v) for k, v in izip(self.columns, zipped_content)) ValueError: Expecting 23 columns, got 26 in row 64 

Puede utilizar el parámetro de names . Por ejemplo, si tienes un archivo csv como este:

 1,2,1 2,3,4,2,3 1,2,3,3 1,2,3,4,5,6 

Y trata de leerlo, recibirás un error.

 >>> pd.read_csv(r'D:/Temp/tt.csv') Traceback (most recent call last): ... Expected 5 fields in line 4, saw 6 

Pero si pasa parámetros de names , obtendrá el resultado:

 >>> pd.read_csv(r'D:/Temp/tt.csv', names=list('abcdef')) abcdef 0 1 2 1 NaN NaN NaN 1 2 3 4 2 3 NaN 2 1 2 3 3 NaN NaN 3 1 2 3 4 5 6 

Espero eso ayude.

también puede cargar el CSV con el separador ‘^’, para cargar toda la cadena en una columna, luego usar división para dividir la cadena en delimitadores requeridos. Después de eso, hace un concat para fusionar con el dataframe original (si es necesario).

 temp=pd.read_csv('test.csv',sep='^',header=None,prefix='X') temp2=temp.X0.str.split(',',expand=True) del temp['X0'] temp=pd.concat([temp,temp2],axis=1) 

Supongamos que tienes un archivo como este:

 a,b,c 1,2,3 1,2,3,4 

Podría usar csv.reader para limpiar el archivo primero,

 lines=list(csv.reader(open('file.csv'))) header, values = lines[0], lines[1:] data = {h:v for h,v in zip (header, zip(*values))} 

y obten:

 {'a' : ('1','1'), 'b': ('2','2'), 'c': ('3', '3')} 

Si no tienes cabecera puedes usar:

 data = {h:v for h,v in zip (str(xrange(number_of_columns)), zip(*values))} 

y luego puedes convertir el diccionario a dataframe con

 import pandas as pd df = pd.DataFrame.from_dict(data) 

El problema con la solución dada es que debe conocer el número máximo de columnas requeridas. No pude encontrar una función directa para este problema, pero seguramente puedes escribir una definición que puede:

  1. lee todas las lineas
  2. dividirlo
  3. contar el número de palabras / elementos en cada fila
  4. almacenar el número máximo de palabras / elementos
  5. coloque ese valor máximo en la opción de nombres (como lo sugiere Roman Pekar )

Aquí está la def (función) que escribí para mis archivos:

 def ragged_csv(filename): f=open(filename) max_n=0 for line in f.readlines(): words = len(line.split(' ')) if words > max_n: max_n=words lines=pd.read_csv(filename,sep=' ',names=range(max_n)) return lines