2013-06-04 143 views
294

我在熊貓中有一個數據框,我想寫入一個CSV文件。我做這個使用:將數據框寫入CSV文件的大熊貓

df.to_csv('out.csv') 

而得到的錯誤:

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

有什麼辦法來解決這個問題很容易(即我有我的數據幀Unicode字符)?有沒有一種方法可以寫入製表符分隔的文件,而不是使用例如CSV 'to-tab'方法(我不認爲存在)?

回答

469

要由製表限定可以使用sep參數的to_csv

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

要使用特定的編碼(例如 'UTF-8')使用encoding論點:

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

'編碼解決= 'utf-8'' – Private

+1

你也可以使用'df.toCSV(FILE_NAME 09月=' \ t')'等 – Blairg23

+2

@ Blairg23我認爲這是這個功能的舊名稱,並且貶值了,事實上 - 這在更新版本的熊貓中不再可用! (我不知道什麼時候它被刪除了......奇怪的是,似乎to_csv已經被用到了0.4之前!http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#id45注意:我們現在在0.14.1) –

5

如果您也指定了UTF-8編碼,有時候您會遇到這些問題。 我建議您在寫入文件時在讀取文件和相同編碼時指定編碼。 這可能會解決您的問題。

8

如果你遇到編碼爲'utf-8'的問題,並且想要按照單元格移動,你可以嘗試以下操作。

的Python 2

(其中 「東風」 就是你的數據框對象)。

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 

然後嘗試:

df.to_csv(file_name) 

您可以檢查的編碼欄目編號:

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

警告:errors ='ignore'會忽略字符,例如

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=',') 

它肯定會工作。

df更改爲您的數據幀名稱並運行。

使用anaconda空閒。

+11

歡迎來到StackOverflow!雖然答案總是值得讚賞的,但3年前問這個問題,並且已經有了一個可以接受的解決方案。請儘量避免將問題頂到問題的頂端,除非問題還沒有被標記爲已解決,或者您發現了一個新的改進的問題解決方案。查看關於如何讓你的答案數的一些提示[編寫優秀答案](http://stackoverflow.com/help/how-to-answer)上的文檔:) –

43

我想添加的東西什麼安迪·海登在他精確答案已經提到。

當使用該方法to_csv存儲DataFrame對象到csv文件,則可能不會被需要來存儲前述索引的DataFrame對象的每個行的

您可以避免通過傳遞False布爾值到index參數。

有點像:

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

所以,如果你的數據幀的對象是一樣的東西:

Color Number 
0 red  22 
1 blue  10 

CSV文件將存儲:

Color,Number 
red,22 
blue,10 

,而不是(的情況下,當默認值True通過)

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

發現它值得分享,乾杯! :-)

0

也可能是沒有這種情況的答案,但我有同樣的錯誤消息 .to_csv我試圖 .toCSV(「name.csv」)和錯誤消息是不同(「'SparseDataFrame'對象沒有屬性'toCSV'」)。所以這個問題是通過打開數據框,以密集的數據幀

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