Escribir un DataFrame de pandas en un archivo CSV

Tengo un dataframe 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 manera de evitar esto fácilmente (es decir, tengo caracteres unicode en mi marco de datos)? ¿Y hay alguna manera de escribir en un archivo delimitado por tabulaciones en lugar de un CSV utilizando, por ejemplo, un método 'to-tab' (que no creo que exista)?

Solución

Para delimitar por una pestaña puede utilizar el argumento sep de to_csv:

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

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

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

Otra cosa que puedes probar si tienes problemas de codificación a 'utf-8' y quieres ir celda por celda podrías probar lo siguiente.

Python 2

(Donde "df" es tu 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 inténtelo:

df.to_csv(file_name)

Puede comprobar la codificación de las columnas mediante:

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

Advertencia: errores='ignorar' sólo 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
Comentarios (0)

A veces se enfrentan estos problemas si se especifica la codificación UTF-8 también. Le recomiendo que especifique la codificación al leer el archivo y la misma codificación al escribirlo. Esto podría resolver su problema.

Comentarios (0)