pandas.read_csv: cómo omitir líneas de comentarios

3 minutos de lectura

avatar de usuario de mathtick
matemáticas

Creo que entiendo mal la intención de read_csv. Si tengo un archivo ‘j’ como

# notes
a,b,c
# more notes
1,2,3

¿Cómo puedo pandas.read_csv este archivo, omitiendo cualquier línea comentada ‘#’? Veo en la ayuda que el ‘comentario’ de las líneas no es compatible, pero indica que se debe devolver una línea vacía. veo un error

df = pandas.read_csv('j', comment="#")

CParserError: Error al tokenizar datos. Error de C: se esperaban 1 campos en la línea 2, vio 3

actualmente estoy en

In [15]: pandas.__version__
Out[15]: '0.12.0rc1'

En la versión ‘0.12.0-199-g4c8ad82’:

In [43]: df = pandas.read_csv('j', comment="#", header=None)

CParserError: Error al tokenizar datos. Error de C: se esperaban 1 campos en la línea 2, vio 3

  • Que es 'j'? No puedo reproducir el error al reemplazar 'j' con la ruta del archivo csv.

    – Bryan

    21 de agosto de 2013 a las 20:17


  • Has probado df = pandas.read_csv('j', comment='#')

    – Teórico

    21 de agosto de 2013 a las 20:19

  • Lo siento, b’#’ fue un error tipográfico. ‘j’ es un archivo de ejemplo. Es un error como lo menciona Andy Hayden a continuación.

    – matemáticas

    21 de agosto de 2013 a las 20:29

  • @mathtick extrañamente obtengo un error ligeramente diferente con el código anterior, pero tengo publicó un problema con el CParserError que describe en github, creo que es un error.

    –Andy Hayden

    21 de agosto de 2013 a las 20:34

  • @AndyHayden … sí, obtuve el error al cargar un archivo diferente al que se muestra en el ejemplo cuando tenía prisa. Intenté reproducirlo en casa y descubrí que el comportamiento parece haber cambiado ligeramente en las versiones más nuevas (probado en ‘0.12.0-199-g4c8ad82’). He actualizado el ejemplo.

    – matemáticas

    22 de agosto de 2013 a las 0:13

avatar de usuario de hlin117
hlin117

Así que creo en los últimos lanzamientos de pandas (versión 0.16.0), podría agregar el comment="#" parámetro en pd.read_csv y esto debería omitir las líneas comentadas.

Estos problemas de github muestran que puedes hacer esto:

Consulte la documentación sobre read_csv: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

  • ¿Qué sucede si tengo más de 1 carácter de comentario? Encontré un archivo de datos que es un volcado de Java y tiene # para líneas de comentarios y @ para nombres de bloque y quiero omitir ambos. En gnuplot podría establecer #@ como caracteres de comentario y omitió ambos, pero en pandas da un error que dice que solo se permite un carácter.

    – Atreyagaurav

    20 de mayo a las 15:32

Avatar de usuario de Andy Hayden
Andy Hayden

Una solución es especificar saltos para ignorar las primeras entradas:

In [11]: s="# notes\na,b,c\n# more notes\n1,2,3"

In [12]: pd.read_csv(StringIO(s), sep=',', comment="#", skiprows=1)
Out[12]: 
    a   b   c
0 NaN NaN NaN
1   1   2   3

De lo contrario read_csv se confunde un poco:

In [13]: pd.read_csv(StringIO(s), sep=',', comment="#")
Out[13]: 
        Unnamed: 0
a   b            c
NaN NaN        NaN
1   2            3

Este parece ser el caso en 0.12.0, he presentado un informe de error.

Como Viktor señala, puedes usar dropna para eliminar el NaN después del hecho… (hay un Problema abierto reciente para que las líneas comentadas se ignoren por completo):

In [14]: pd.read_csv(StringIO(s2), comment="#", sep=',').dropna(how='all')
Out[14]: 
   a  b  c
1  1  2  3

Nota: el índice predeterminado “revelará” el hecho de que faltan datos.

  • Y también como no quieres las líneas de comentarios solo llama .dropna(how='all').reset_index(drop=True) después.

    – Víctor Kerkez

    21/08/2013 a las 21:00


Avatar de usuario de Finn Årup Nielsen
Finn Arup Nielsen

Estoy en Pandas versión 0.13.1 y esto comentarios-en-csv problema todavía me molesta.

Aquí está mi solución actual:

def read_csv(filename, comment="#", sep=','):
    lines = "".join([line for line in open(filename) 
                     if not line.startswith(comment)])
    return pd.read_csv(StringIO(lines), sep=sep)

De lo contrario con pd.read_csv(filename, comment="#") yo obtengo

pandas.parser.CParserError: Error al tokenizar datos. Error de C: se esperaban 1 campos en la línea 16, vio 3.

¿Ha sido útil esta solución?