Jag har ett dataframe i Pandas som jag vill skriva till en CSV-fil. Jag gör detta med hjälp av:
df.to_csv('out.csv')
Och får felet:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
Finns det något sätt att enkelt komma runt detta (dvs. jag har unicode-tecken i min dataruta)? Och finns det ett sätt att skriva till en tab-delimiterad fil i stället för en CSV-fil med hjälp av t.ex. en 'to-tab' metod (som jag inte tror finns)?
För att avgränsa med en tabb kan du använda argumentet sep
i [to_csv
] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html):
df.to_csv(file_name, sep='\t')
För att använda en specifik kodning (t.ex. 'utf-8') använd argumentet encoding
:
df.to_csv(file_name, sep='\t', encoding='utf-8')
Om du har problem med att koda till 'utf-8' och vill gå cell för cell kan du prova följande.
Python 2
(Där "df" är ditt DataFrame-objekt.)
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
Försök sedan:
df.to_csv(file_name)
Du kan kontrollera kolumnernas kodning genom att:
for column in df.columns:
print '{0} {1}'.format(str(type(df[column][0])),str(column))
Varning: errors='ignore' kommer bara att utelämna tecknet, t.ex.
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
Ibland uppstår dessa problem om du också anger UTF-8-kodning. Jag rekommenderar att du anger kodning när du läser filen och samma kodning när du skriver till filen. Detta kan lösa dina problem.