python agregar - Pandas escribiendo el marco de datos en un archivo CSV




normalizar filtrar (7)

Otra cosa que puedes probar si tienes problemas con la codificación de 'utf-8' y quieres ir de celda en celda, puedes probar lo siguiente.

Python 2

(Donde "df" es su objeto DataFrame).

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = unicode(x.encode('utf-8','ignore'),errors ='ignore') if type(x) == unicode else unicode(str(x),errors='ignore')
            df.set_value(idx,column,x)
        except Exception:
            print 'encoding error: {0} {1}'.format(idx,column)
            df.set_value(idx,column,'')
            continue

Entonces intenta:

df.to_csv(file_name)

Puede verificar la codificación de las columnas por:

for column in df.columns:
    print '{0} {1}'.format(str(type(df[column][0])),str(column))

Advertencia: errores = 'ignorar' solo omitirá el carácter, por ejemplo

IN: unicode('Regenexx\xae',errors='ignore')
OUT: u'Regenexx'

Python 3

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = x if type(x) == str else str(x).encode('utf-8','ignore').decode('utf-8','ignore')
            df.set_value(idx,column,x)
        except Exception:
            print('encoding error: {0} {1}'.format(idx,column))
            df.set_value(idx,column,'')
            continue

Tengo un marco de datos en pandas que me gustaría escribir en un archivo CSV. Estoy haciendo esto usando:

df.to_csv('out.csv')

Y obteniendo el error:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)

¿Hay alguna forma de evitar esto fácilmente (es decir, tengo caracteres Unicode en mi marco de datos)? ¿Y hay una manera de escribir en un archivo delimitado por tabulaciones en lugar de un CSV usando, por ejemplo, un método 'to-tab' (que no creo que exista)?


Si no quieres el índice.

 df.to_csv("out.csv", index=False)

Puede que no sea la respuesta para este caso, pero como tuve el mismo mensaje de error con .to_csv intenté .toCSV ('name.csv') y el mensaje de error fue diferente ("el objeto 'SparseDataFrame' no tiene atributo ' toCSV '"). Así que el problema se resolvió convirtiendo el marco de datos en un marco de datos denso

df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')

Para delimitar por una pestaña puedes usar el argumento sep de to_csv :

df.to_csv(file_name, sep='\t')

Para usar una codificación específica (por ejemplo, 'utf-8') use el argumento de encoding :

df.to_csv(file_name, sep='\t', encoding='utf-8')

A veces se enfrenta a estos problemas si también especifica la codificación UTF-8. Le recomiendo que especifique la codificación mientras lee el archivo y la misma codificación mientras escribe en el archivo. Esto podría resolver su problema.


Me gustaría agregar algo a lo que Andy Hayden ya mencionó en su respuesta.

Cuando almacena un objeto DataFrame en un archivo csv utilizando el método to_csv , probablemente no necesite almacenar los índices anteriores de cada fila del objeto DataFrame .

Puede evitar eso pasando un valor booleano False al parámetro de index .

Algo así como

df.to_csv(file_name, encoding='utf-8', index=False)

Entonces si tu objeto DataFrame es algo como:

  Color  Number
0   red     22
1  blue     10

El archivo csv almacenará:

Color,Number
red,22
blue,10

en lugar de (el caso cuando se pasó el valor predeterminado True )

,Color,Number
0,red,22
1,blue,10

Encontré que vale la pena compartirlo, Saludos! :-)


El archivo abierto por codecs.open es un archivo que toma datos unicode , los codifica en iso-8859-1 y los escribe en el archivo. Sin embargo, lo que intentas escribir no es unicode ; usted toma unicode y lo codifica en iso-8859-1 usted mismo . Eso es lo que hace el método unicode.encode , y el resultado de codificar una cadena Unicode es un bytestring (un tipo str ).

Debe usar normal open() y codificar el open() Unicode, o (generalmente una mejor idea) usar codecs.open() y no codificar los datos usted mismo.







python csv pandas dataframe