Menulis panda DataFrame ke file CSV

Saya memiliki dataframe di panda yang saya ingin menulis ke file CSV. Saya melakukan ini dengan menggunakan:

df.to_csv('out.csv')

Dan mendapatkan error:

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

Apakah ada cara untuk mendapatkan sekitar ini dengan mudah (yaitu saya memiliki karakter unicode dalam data frame)? Dan apakah ada cara untuk menulis ke tab delimited file, bukan dari sebuah CSV menggunakan misalnya 'untuk-tab' metode (yang saya tidak berpikir ada)?

Larutan

Untuk membatasi dengan tab anda dapat menggunakan sep argumen dari to_csv:

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

Untuk menggunakan pengkodean tertentu (misalnya 'utf-8') menggunakan encoding argumen:

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

Ketika anda menyimpan sebuah DataFrame objek ke a file csv menggunakan to_csv metode, anda mungkin tidak akan perlu menyimpan sebelumnya indeks setiap baris dari DataFrame objek.

Anda dapat menghindari bahwa dengan melewati Palsu nilai boolean untuk index parameter.

Agak seperti:

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

Jadi jika anda DataFrame objek adalah sesuatu seperti:

  Color  Number
0   red     22
1  blue     10

Csv file yang akan menyimpan:

Color,Number
red,22
blue,10

bukan (kasus ketika nilai default Benar disahkan)

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

Sesuatu yang lain anda dapat mencoba jika anda mengalami masalah encoding untuk 'utf-8' dan ingin pergi sel-sel yang bisa anda coba berikut ini.

Python 2

(Mana "df" anda DataFrame objek.)

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

Kemudian coba:

df.to_csv(file_name)

Anda dapat memeriksa encoding dari kolom oleh:

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

Peringatan: kesalahan='mengabaikan' hanya akan menghilangkan karakter misalnya

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

Kadang-kadang anda menghadapi masalah-masalah ini jika anda menentukan encoding UTF-8 juga. Saya sarankan anda untuk menentukan encoding saat membaca file dan encoding yang sama saat menulis ke file. Hal ini dapat memecahkan masalah anda.

Komentar (0)

Untuk menulis panda DataFrame ke CSV file, anda akan perlu DataFrame.to_csv. Fungsi ini menyediakan banyak argumen dengan default masuk akal bahwa anda akan lebih sering daripada tidak perlu mengganti yang sesuai untuk anda gunakan spesifik kasus ini. Misalnya, anda mungkin ingin menggunakan pemisah, mengubah format datetime, atau penurunan indeks saat menulis. to_csv memiliki argumen anda dapat lulus untuk memenuhi persyaratan ini.

Berikut ini's tabel daftar beberapa skenario umum penulisan ke file CSV dan sesuai argumen yang dapat anda gunakan untuk mereka.

catatan kaki

  1. Default pemisah diasumsikan koma (','). Don't perubahan ini kecuali anda tahu yang anda butuhkan untuk.
  2. Secara default, indeks df ditulis sebagai kolom pertama. Jika anda DataFrame tidak memiliki indeks (IOW, yang df.index default RangeIndex), maka anda akan ingin untuk mengatur index=False ketika menulis. Untuk menjelaskan hal ini dalam cara yang berbeda, jika data anda TIDAK memiliki indeks, anda dapat (dan harus) menggunakan index=True atau hanya meninggalkan itu benar-benar (sebagai default adalah Benar).
  3. Ini akan menjadi bijaksana untuk mengatur parameter ini jika anda menulis data string sehingga aplikasi lain tahu bagaimana untuk membaca data anda. Ini juga akan menghindari potensi `UnicodeEncodeError ini mungkin anda alami saat menyimpan.
  4. Kompresi dianjurkan jika anda menulis besar DataFrames (>100K baris) ke disk karena akan mengakibatkan jauh lebih kecil output file. OTOH, itu akan berarti menulis waktu akan meningkat (dan akibatnya, baca waktu karena file akan perlu dikompres).
Komentar (0)

bisa jadi bukan jawaban untuk hal ini, tapi seperti yang saya memiliki kesalahan yang sama-pesan dengan .to_csv saya mencoba .toCSV('nama.csv') dan kesalahan-pesan yang berbeda (",'SparseDataFrame' objek memiliki atribut 'toCSV',"). Agar masalah ini diselesaikan dengan memutar dataframe padat dataframe

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

Contoh ekspor dalam file dengan full path pada Windows dan dalam kasus anda memiliki file header:

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

Contoh jika anda ingin menyimpan dalam folder ekspor yang berada di direktori yang sama di mana anda script ini dengan utf-8 encodint dan tab sebagai pemisah:

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