Scrivere un DataFrame panda in un file CSV


715

Ho un frame di dati in Panda che vorrei scrivere in un file CSV. Lo sto facendo usando:

df.to_csv('out.csv')

E ottenere l'errore:

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

Esiste un modo per aggirare facilmente questo problema (ovvero 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 ad esempio un metodo 'to-tab' (che non credo esista)?

Risposte:


1045

Per delimitare da una scheda è possibile utilizzare l' separgomento di to_csv:

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

Per usare una codifica specifica (es. 'Utf-8') usa l' encodingargomento:

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

32
Vorrei aggiungere index=Falseper eliminare l'indice.
Medhat,

11
Inizialmente ero confuso su come ho trovato una risposta alla domanda che avevo già scritto 7 anni fa.
Hayden,

251

Quando si memorizza un DataFrameoggetto in un file CSV utilizzando il to_csvmetodo, probabilmente non essere bisogno di memorizzare i indici precedenti di ciascuna fila di DataFrameoggetto.

Puoi evitarlo passando un Falsevalore booleano al indexparametro.

Un po 'come:

df.to_csv(file_name, encoding='utf-8', index=False)

Quindi se il tuo oggetto DataFrame è simile a:

  Color  Number
0   red     22
1  blue     10

Il file CSV memorizzerà:

Color,Number
red,22
blue,10

anziché (il caso in cui è stato passato il valore predefinito True )

,Color,Number
0,red,22
1,blue,10

Che cosa succede se l'indicizzazione è desiderata, ma dovrebbe anche avere un titolo? Usi solo df.rename_axis('index_name')? ciò non modifica il file stesso
Zap,

20

Per scrivere un DataFrame Panda in un file CSV, è necessario DataFrame.to_csv. Questa funzione offre molti argomenti con impostazioni predefinite ragionevoli che spesso dovrai ignorare per soddisfare il tuo caso d'uso specifico. Ad esempio, è possibile che si desideri utilizzare un separatore diverso, modificare il formato datetime o eliminare l'indice durante la scrittura. to_csvha argomenti che puoi passare per soddisfare questi requisiti.

Ecco una tabella che elenca alcuni scenari comuni di scrittura su file CSV e gli argomenti corrispondenti che è possibile utilizzare per essi.

Scrivi a CSV ma amico

Le note

  1. Si presume che il separatore predefinito sia una virgola ( ','). Non cambiarlo se non sai di doverlo fare.
  2. Per impostazione predefinita, l'indice di dfviene scritto come prima colonna. Se il tuo DataFrame non ha un indice (IOW, df.indexè il valore predefinito RangeIndex), ti consigliamo di impostare index=Falsedurante la scrittura. Per spiegarlo in modo diverso, se i tuoi dati hanno un indice, puoi (e dovresti) utilizzarlo index=Trueo semplicemente lasciarlo fuori completamente (come predefinito True).
  3. Sarebbe saggio impostare questo parametro se si stanno scrivendo dati stringa in modo che altre applicazioni sappiano come leggere i dati. Questo eviterà anche qualsiasi potenziale UnicodeEncodeErrorche potresti incontrare durante il salvataggio.
  4. La compressione è consigliata se si scrivono DataFrame di grandi dimensioni (> 100 KB di righe) su disco poiché si otterranno file di output molto più piccoli. OTOH, significherà che il tempo di scrittura aumenterà (e di conseguenza, il tempo di lettura dal momento che il file dovrà essere decompresso).

18

Qualcos'altro 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" è l'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

Quindi prova:

df.to_csv(file_name)

Puoi controllare la codifica delle colonne:

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

Attenzione: errori = 'ignora' ometterà il carattere, ad es

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

11

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


7

Esempio di esportazione in file con percorso completo su Windows e nel caso in cui il file abbia intestazioni :

df.to_csv (r'C:\Users\John\Desktop\export_dataframe.csv', index = None, header=True) 

Esempio se si desidera archiviare nella cartella nella stessa directory in cui si trova lo script, con codifica utf-8 e scheda come separatore :

df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header='true')

7

potrebbe non essere la risposta per questo caso, ma come ho avuto lo stesso errore-messaggio con .to_csvho provato .toCSV('name.csv')e l'errore-messaggio era diverso (" SparseDataFrame' object has no attribute 'toCSV'). Quindi il problema è stato risolto girando dataframe a densa dataframe

df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')

Hai ricevuto l'errore nel secondo, come sembra che tu abbia usato .toCSVe non .to_csv. Hai dimenticato il carattere di sottolineatura
Kyle C
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.