Jeg har et dataframe i pandas, som jeg gerne vil skrive til en CSV-fil. Jeg gør dette ved hjælp af:
df.to_csv('out.csv')
Og får fejlen:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
Er der nogen måde at komme udenom dette nemt (dvs. jeg har unicode-tegn i min dataramme)? Og er der en måde at skrive til en tab-delimiteret fil i stedet for en CSV ved hjælp af f.eks. en 'to-tab' metode (som jeg ikke tror findes)?
For at afgrænse med en tabulator kan du bruge sep
-argumentet i to_csv
:
df.to_csv(file_name, sep='\t')
Hvis du vil bruge en specifik kodning (f.eks. 'utf-8'), skal du bruge argumentet encoding
:
df.to_csv(file_name, sep='\t', encoding='utf-8')
Noget andet du kan prøve, hvis du har problemer med at kode til 'utf-8' og ønsker at gå celle for celle, kan du prøve følgende.
Python 2
(Hvor "df" er dit 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
Prøv derefter:
df.to_csv(file_name)
Du kan kontrollere kodningen af kolonnerne ved at:
for column in df.columns:
print '{0} {1}'.format(str(type(df[column][0])),str(column))
Advarsel: errors='ignore' vil bare udelade tegnet, f.eks.
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
Nogle gange opstår disse problemer, hvis du også angiver UTF-8-kodning. Jeg anbefaler, at du angiver kodning, mens du læser filen, og samme kodning, mens du skriver til filen. Dette kan løse dit problem.