python - renombrar - Pandas escribiendo el marco de datos en un archivo CSV
pandas renombrar columnas (7)
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.
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)?
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! :-)
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
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'')
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'')
df.to_csv(''out.csv'', sep='','')
Funcionará definitivamente.
Cambie df
al nombre de su nombre de marco de datos y ejecute.
Utilice anaconda inactivo.