Scrivere un pandas DataFrame in un file CSV

Ho un dataframe in pandas che vorrei scrivere in un file CSV. Lo sto facendo usando:

df.to_csv('out.csv')

E ottengo l'errore:

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

C'è un modo per aggirare questo facilmente (cioè ho caratteri unicode nel mio frame di dati)? E c'è un modo per scrivere in un file delimitato da tabulazioni invece che in un CSV usando per esempio un metodo 'to-tab' (che non credo esista)?

Soluzione

Per delimitare con una tabulazione puoi usare l'argomento sep di to_csv:

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

Per usare una codifica specifica (per esempio 'utf-8') usa l'argomento encoding:

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

Un'altra cosa che puoi provare se hai problemi con la codifica in 'utf-8' e vuoi andare cella per cella potresti provare quanto segue.

Python 2

(Dove "df" è il tuo oggetto 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

Allora provate:

df.to_csv(file_name)

Potete controllare la codifica delle colonne con:

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

Attenzione: errors='ignore' ometterà semplicemente il carattere, ad esempio

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
Commentari (0)

A volte si incontrano questi problemi se si specifica anche la codifica UTF-8. Vi consiglio di specificare la codifica durante la lettura del file e la stessa codifica durante la scrittura del file. Questo potrebbe risolvere il vostro problema.

Commentari (0)