Scrie un panda DataFrame pentru a fișier CSV

Am o dataframe la panda pe care aș dori să scrie într-un fișier CSV. Eu fac asta folosind:

df.to_csv('out.csv')

Si primesc eroarea:

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

Există vreo modalitate de a obține în jurul valorii de acest lucru cu ușurință (de exemplu, am caractere unicode în cadru de date)? Și există o modalitate de a scrie o fila fișier delimitat în loc de un CSV utilizând, de exemplu, o 'sa-tab' metoda (care nu cred ca exista)?

Soluția

Pentru a delimita de o filă, puteți folosi " sep " argumentul to_csv:

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

Pentru a utiliza o anumită codare (de exemplu, 'utf-8') a folosi codare argument:

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

Atunci când stocați o DataFrame obiect într-un fișier csv utilizarea to_csv metoda, probabil va fi nevoie pentru a stoca precedent indici fiecare rand a DataFrame obiect.

Puteți evitarea că prin care trece un "Fals" valoare booleană la "index" parametru.

Oarecum, cum ar fi:

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

Deci, dacă DataFrame obiect este ceva de genul:

  Color  Number
0   red     22
1  blue     10

Fișierul csv va stoca:

Color,Number
red,22
blue,10

în loc de (în cazul când valoare implicită "Adevărat" a fost adoptată)

,Color,Number
0,red,22
1,blue,10
Comentarii (1)

Mai poți face și altceva, dacă aveți probleme de codare a 'utf-8' și vreau să merg celulă cu celulă, puteți încerca următoarele.

Python 2

(În cazul în care "df" este DataFrame obiect.)

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

Apoi, încercați:

df.to_csv(file_name)

Puteți verifica codarea coloanele de:

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

Avertisment: erori='ignor' va omite caracterul de ex.

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

Uneori se confruntă cu aceste probleme daca ai specifica codificarea UTF-8, de asemenea,. Am recomandăm să vă pentru a specifica codarea în timp ce citiți fișierul și aceeași codare în timp ce scrierea în fișier. Acest lucru ar putea rezolva problema ta.

Comentarii (0)

Pentru a scrie un panda DataFrame într-un fișier CSV, veți avea nevoie de DataFrame.to_csv. Această funcție oferă multe argumente cu valori implicite rezonabile că veți mai des decât nu trebuie să trec pentru a se potrivi anumit caz de utilizare. De exemplu, ați putea dori să utilizați un alt separator, schimba datetime format, sau drop index atunci când scrieți. to_csv are argumente puteți trece pentru a răspunde acestor cerințe.

Aici's un tabel în care sunt enumerate câteva scenarii comune de scriere pentru fișiere CSV și corespunzătoare argumente puteți utiliza pentru ei.

Note

  1. Implicit separator se presupune a fi o virgulă (','). Don't schimba acest lucru dacă nu știi că ai nevoie.
  2. În mod implicit, indicele de " df " este scris ca prima coloană. Dacă DataFrame nu are un index (de JOS, de df.index este implicit RangeIndex), atunci veți dori să setați index=False atunci când scrieți. Pentru a explica acest lucru într-un mod diferit, dacă datele NU au un index, puteți (și ar trebui) să folosesc index=True` sau pur și simplu lăsați-l complet (implicit este "Adevărat").
  3. Ar fi înțelept să setați acest parametru dacă sunteți scris șir de date, astfel încât alte aplicații știu cum să citească datele. Acest lucru va evita orice potențiale `UnicodeEncodeError e s-ar putea întâlni în timp ce de economisire.
  4. Compresia este recomandat dacă sunteți scris mare DataFrames (>100K rânduri) pe disc ca aceasta va duce la mult mai mici fișiere de ieșire. OTOH, aceasta va însemna scrie timp, va crește (și, în consecință, citeste timp de când dosarul va trebui să fie decomprimat).
Comentarii (0)

acesta ar putea fi răspunsul pentru acest caz, dar ca am avut aceeasi eroare, mesajul cu .to_csv am încercat .toCSV('numele.csv') și eroare, mesajul a fost diferit ("'SparseDataFrame' obiect nu are atributul 'toCSV'"). Deci, problema a fost rezolvată prin rotirea dataframe dens dataframe

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

Exemplu de export în fișier cu calea completă pe Windows și în cazul în care fișierul dvs. are anteturi:

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

Exemplu, dacă aveți nevoie pentru a stoca în folderul de export, care este în același director în care script-ul dvs. este cu utf-8 encodint și tab ca separator:

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