2013-06-04 102 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')