2013-06-04 10 views
294

Ho un dataframe in panda che vorrei scrivere in un file CSV. Sto facendo questo utilizzando:Pandas che scrive il dataframe nel file CSV

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) 

C'è un modo per aggirare questo facilmente (vale a dire non ho i caratteri Unicode nella mia data frame)? E c'è un modo per scrivere su un file delimitato da tabulazioni invece che su un CSV usando ad es. un metodo 'to-tab' (che non penso esista)?

risposta

469

per delimitare da una scheda è possibile utilizzare la sep argomento to_csv:

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

Per utilizzare una codifica specifica (ad esempio 'utf-8') utilizzano l'argomento encoding:

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

'encoding = 'utf-8'' – Private

+1

È possibile anche usare' df.toCSV (nome_file, settembre =' \ t ') 'ecc – Blairg23

+2

@ Blairg23 Penso che questo fosse il vecchio nome di questa funzione e che fosse deprezzato, infatti - questo non è più disponibile nella versione più recente dei panda! (Non sono sicuro quando è stato rimosso ... stranamente sembra che to_csv sia stato usato fin da 0.4! Http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#id45 Nota: noi ora sono 0.14.1) –

5

A volte si affrontano 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 su file. Questo potrebbe risolvere il tuo problema.

8

Qualcos'altro che puoi provare se hai problemi di codifica per "utf-8" e vuoi passare da una cella all'altra puoi 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 provare:

df.to_csv(file_name) 

È possibile controllare la codifica del colonne di:

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

Attenzione: errori = 'ignora' ometteranno 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 
0
df.to_csv('out.csv', sep=',') 

Si lavorerà sicuramente.

Modificare df al nome del nome del dataframe ed eseguire.

Utilizzare anaconda inattivo.

+11

Benvenuti in StackOverflow! Sebbene le risposte siano sempre apprezzate, questa domanda è stata posta 3 anni fa e aveva già una soluzione accettata. Si prega di cercare di evitare di "far saltare" le domande in alto fornendo risposte, a meno che la domanda non sia già stata contrassegnata come risolta, oppure si sia trovata una soluzione nuova e migliorata al problema. Controlla la documentazione su [scrivendo ottime risposte] (http://stackoverflow.com/help/how-to-answer) per alcuni suggerimenti su come far contare le tue risposte :) –

43

vorrei aggiungere qualcosa a ciò cheAndy Hayden già citato nel suo preciso risposta.

Quando si memorizza un oggetto DataFrame in un file csv utilizzando il metodo to_csv, è probabilmente non essere bisogno di memorizzare i precedenti indici di ogni fila dell'oggetto DataFrame.

È possibile evitare passando un valore booleano False al parametro index.

Un po 'come:

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

Quindi, se il vostro oggetto dataframe è qualcosa di simile:

Color Number 
0 red  22 
1 blue  10 

il file CSV memorizzerà:

Color,Number 
red,22 
blue,10 

invece che (nel caso in cui il valore predefinitoTrue passato)

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

trovato vale la pena condividere, Cheers! :-)

0

potrebbe non essere la risposta per questo caso, ma come ho avuto lo stesso errore-messaggio con .to_csv Ho provato .toCSV ('name.csv') e l'errore-messaggio è stato diverso ("L'oggetto" SparseDataFrame "non ha attributo" toCSV ""). Quindi il problema è stato risolto girando dataframe al denso dataframe

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