Pandas escribiendo el dataframe 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 forma de evitar esto fácilmente (es decir, tengo caracteres Unicode en mi dataframe)? ¿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)?

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

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

Para usar una encoding específica (por ejemplo, ‘utf-8’) use el argumento de encoding :

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

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 

Otra cosa que puedes probar si tienes problemas con la encoding 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 encoding 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 

Si no quieres el índice.

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

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

podría no ser la respuesta para este caso, pero como tenía el mismo mensaje de error con .to_csv , intenté .toCSV (‘name.csv’) y el mensaje de error era diferente (“el objeto ‘SparseDataFrame’ no tiene atributo ‘ toCSV ‘”). Así que el problema se resolvió convirtiendo el dataframe en un dataframe denso

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