read - Python Pandas Error al tokenizar los datos
pandas read_csv dtype example (16)
Algunas veces el problema no es cómo usar Python, sino con los datos sin procesar.
Recibí este mensaje de error
Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.
Resultó que en la descripción de la columna a veces había comas. Esto significa que el archivo CSV debe limpiarse o utilizarse otro separador.
Estoy tratando de usar pandas para manipular un archivo .csv pero obtengo este error:
pandas.parser.CParserError: Error al tokenizar datos. C error: se espera 2 campos en la línea 3, vio 12
Intenté leer los documentos de los pandas, pero no encontré nada.
Mi código es simple:
path = ''GOOG Key Ratios.csv''
#print(open(path).read())
data = pd.read_csv(path)
¿Cómo puedo resolver esto? ¿Debo usar el módulo csv
u otro idioma?
El archivo es de Morningstar
Aunque no es el caso para esta pregunta, este error también puede aparecer con datos comprimidos. Configurar explícitamente el valor para la compression
kwarg
resolvió mi problema.
result = pandas.read_csv(data_source, compression=''gzip'')
El analizador se confunde por el encabezado del archivo. Lee la primera fila e infiere el número de columnas de esa fila. Pero las primeras dos filas no son representativas de los datos reales en el archivo.
Pruébalo con data = pd.read_csv(path, skiprows=2)
Este es definitivamente un problema de delimitador, ya que la mayoría de CSV CSV se crean utilizando sep=''/t''
por lo tanto, intente read_csv
usando el carácter de tabulación (/t)
usando separador /t
. por lo tanto, intente abrir utilizando la siguiente línea de código.
data=pd.read_csv("File_path", sep=''/t'')
He tenido este problema algunas veces yo mismo. Casi siempre, la razón es que el archivo que estaba intentando abrir no era un CSV correctamente guardado para empezar. Y por "correctamente", quiero decir que cada fila tiene el mismo número de separadores o columnas.
Normalmente sucedió porque abrí el archivo CSV en Excel y luego lo guardé de forma incorrecta. Aunque la extensión del archivo todavía era .csv, el formato CSV puro había sido alterado.
Cualquier archivo guardado con pandas to_csv tendrá el formato correcto y no debería tener ese problema. Pero si lo abre con otro programa, puede cambiar la estructura.
Espero que ayude.
He tenido un problema similar al intentar leer una tabla delimitada por tabulaciones con espacios, comas y comillas:
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
Esto dice que tiene algo que ver con el motor de análisis C (que es el predeterminado). Tal vez cambiar a uno de pitón cambiará cualquier cosa
counts = pd.read_table(path_counts, sep=''/t'', index_col=2, header=None, engine=''python'')
Segmentation fault (core dumped)
Ahora que es un error diferente.
Si continuamos y tratamos de eliminar espacios de la tabla, el error de python-engine cambia una vez más:
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 ''"''
Y queda claro que los pandas tenían problemas para analizar nuestras filas. Para analizar una tabla con el motor de Python, necesitaba eliminar todos los espacios y citas de la tabla de antemano. Mientras tanto, C-engine siguió chocando incluso con comas en filas.
Para evitar crear un nuevo archivo con reemplazos, hice esto, ya que mis tablas son pequeñas:
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; dr
Cambie el motor de análisis, trate de evitar citas / comas / espacios no delimitantes en sus datos.
Me encontré con el mismo problema. Usar pd.read_table()
en el mismo archivo fuente pareció funcionar. No pude encontrar el motivo para esto, pero fue una solución útil para mi caso. Tal vez alguien más conocedor pueda arrojar más luz sobre por qué funcionó.
Editar: descubrí que este error aumenta cuando tienes algún texto en tu archivo que no tiene el mismo formato que los datos reales. Esta suele ser información de encabezado o pie de página (más de una línea, por lo que skip_header no funciona) que no estará separada por el mismo número de comas que sus datos reales (cuando se usa read_csv). El uso de read_table usa una pestaña como el delimitador que podría eludir el error actual de los usuarios pero introducir otros.
Por lo general, soluciono esto leyendo los datos adicionales en un archivo y luego uso el método read_csv ().
La solución exacta puede diferir dependiendo de su archivo real, pero este enfoque me ha funcionado en varios casos
Puede ser un problema con
- los delimitadores en sus datos
- la primera fila, como @TomAugspurger notó asiduamente
Para resolverlo, intente especificar los argumentos sep
y / o del header
al llamar a read_csv
. Por ejemplo,
df = pandas.read_csv(fileName, sep=''delimiter'', header=None)
En el código anterior, sep
define el delimitador y el header=None
le dice a los pandas que los datos de origen no tienen fila para encabezados / títulos de columna. Así saith the docs : "Si el archivo no contiene una fila de encabezado, entonces debe pasar explícitamente header = None". En este caso, los pandas crean automáticamente indentaciones de números enteros para cada campo {0,1,2, ...}.
De acuerdo con los documentos, el delimitador no debería ser un problema. Los documentos dicen que "si sep es None [no especificado], intentará determinar esto automáticamente". Sin embargo, no he tenido buena suerte con esto, incluidas las instancias con delimitadores obvios. Pero, definir sep
no es arduo.
Su archivo CSV puede tener un número variable de columnas y read_csv
infiere el número de columnas de las primeras filas. Dos formas de resolverlo en este caso:
1) Cambie el archivo CSV para tener una primera línea ficticia con un número máximo de columnas (y especifique el header=[0]
)
2) O use names = list(range(0,N))
donde N es el número máximo de columnas.
Tenía un conjunto de datos con números de fila preexistentes, utilicé index_col:
pd.read_csv(''train.csv'', index_col=0)
Tuve este problema también, pero tal vez por una razón diferente. Tenía algunas comas finales en mi CSV que estaban agregando una columna adicional que los pandas intentaban leer. Usando los siguientes trabajos, simplemente ignora las líneas incorrectas:
data = pd.read_csv(''file1.csv'', error_bad_lines=False)
Si desea mantener las líneas un tipo de hack feo para manejar los errores, haga lo siguiente:
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
Procedí a escribir un script para volver a insertar las líneas en el DataFrame, ya que las líneas incorrectas vendrán dadas por la variable ''line'' en el código anterior. Todo esto se puede evitar simplemente usando el lector csv. Es de esperar que los desarrolladores de pandas puedan hacer que sea más fácil lidiar con esta situación en el futuro.
Tuve un error similar y el problema fue que tenía algunas comillas escapadas en mi archivo csv y necesitaba establecer el parámetro escapechar de forma adecuada.
Una alternativa que he encontrado que es útil para tratar con errores de análisis similares usa el módulo CSV para redirigir los datos a pandas df. Por ejemplo:
import csv
import pandas as pd
path = ''C:/FileLocation/''
file = ''filename.csv''
f = open(path+file,''rt'')
reader = csv.reader(f)
#once contents are available, I then put them in a list
csv_list = []
for l in reader:
csv_list.append(l)
f.close()
#now pandas has no problem getting into a df
df = pd.DataFrame(csv_list)
Encuentro que el módulo CSV es un poco más robusto para archivos separados por comas de formato deficiente, por lo que he tenido éxito con esta ruta para abordar problemas como estos.
también podrías intentarlo;
data = pd.read_csv(''file1.csv'', error_bad_lines=False)
try: pandas.read_csv(path, sep = '','' ,header=None)
use pandas.read_csv(''CSVFILENAME'',header=None,sep='', '')
al intentar leer datos de csv del enlace
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
Copié los datos del sitio en mi archivo csv. Tenía espacios extra así que se utilizó sep = '','' y funcionó :)