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)?
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')
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
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
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.
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
- Default pemisah diasumsikan koma (
','
). Don't perubahan ini kecuali anda tahu yang anda butuhkan untuk.- Secara default, indeks
df
ditulis sebagai kolom pertama. Jika anda DataFrame tidak memiliki indeks (IOW, yangdf.index
defaultRangeIndex
), maka anda akan ingin untuk mengaturindex=False
ketika menulis. Untuk menjelaskan hal ini dalam cara yang berbeda, jika data anda TIDAK memiliki indeks, anda dapat (dan harus) menggunakanindex=True
atau hanya meninggalkan itu benar-benar (sebagai default adalahBenar
).- 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.
- 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).
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')
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')