Skrive en pandas DataFrame til en CSV-fil

Jeg har en dataramme i pandas som jeg ønsker å skrive til en CSV-fil. Jeg gjør dette ved hjelp av:

df.to_csv('out.csv')

og får en feilmelding:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)

Er det mulig å omgå dette på en enkel måte (dvs. jeg har unicode-tegn i datarammen)? Og finnes det en måte å skrive til en tabulatoravgrenset fil i stedet for en CSV-fil ved hjelp av f.eks. en 'to-tab' metode (som jeg ikke tror finnes)?

Løsning

For å avgrense med en tabulator kan du bruke argumentet sep i to_csv:

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

Hvis du vil bruke en bestemt koding (f.eks. 'utf-8'), bruker du argumentet encoding:

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

Noe annet du kan prøve hvis du har problemer med å kode til 'utf-8' og ønsker å gå celle for celle, kan du prøve følgende.

**Python 2

(Hvor "df" er DataFrame-objektet ditt.)

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 deretter:

df.to_csv(file_name)

Du kan sjekke kodingen av kolonnene ved hjelp av:

for column in df.columns:
    print '{0} {1}'.format(str(type(df[column][0])),str(column))

Advarsel: errors='ignore' vil bare utelate 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
Kommentarer (0)

Noen ganger får du disse problemene hvis du også angir UTF-8-koding. Jeg anbefaler deg å spesifisere koding mens du leser filen og samme koding mens du skriver til filen. Dette kan løse problemet.

Kommentarer (0)