Ik heb een dataframe in pandas dat ik wil wegschrijven naar een CSV bestand. Ik doe dit met behulp van:
df.to_csv('out.csv')
En krijg de foutmelding:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
Is er een manier om dit eenvoudig te omzeilen (d.w.z. ik heb unicode karakters in mijn data frame)? En is er een manier om naar een tab delimited bestand te schrijven in plaats van een CSV met behulp van bijvoorbeeld een 'to-tab' methode (die volgens mij niet bestaat)?
Om met een tab te begrenzen kunt u het sep
argument van to_csv
gebruiken:
df.to_csv(file_name, sep='\t')
Om een specifieke encoding te gebruiken (bijv. 'utf-8') gebruik je het encoding
argument:
df.to_csv(file_name, sep='\t', encoding='utf-8')
Iets anders dat u kunt proberen als u problemen hebt met het coderen naar 'utf-8' en u cel voor cel wilt gaan, zou u het volgende kunnen proberen.
Python 2
(Waarbij "df" uw DataFrame object is).
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
Probeer dan:
df.to_csv(file_name)
U kunt de codering van de kolommen controleren door:
for column in df.columns:
print '{0} {1}'.format(str(type(df[column][0])),str(column))
Waarschuwing: errors='ignore' zal gewoon het karakter weglaten, bijv.
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
Soms krijg je met deze problemen te maken als je ook UTF-8 codering opgeeft. Ik raad u aan om encoding op te geven tijdens het lezen van een bestand en dezelfde encoding tijdens het schrijven naar een bestand. Dit zou uw probleem kunnen oplossen.