Pandas writing dataframe to CSV file
我在pandas中有一个数据帧,我想将它写入一个csv文件。我这样做是为了:
1 | df.to_csv('out.csv') |
得到错误:
1 | UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128) |
有没有什么方法可以轻松解决这个问题(例如,我的数据框中有Unicode字符)?是否有一种方法可以使用"to tab"方法(我认为不存在)而不是csv来写入以制表符分隔的文件?
要用制表符定界,可以使用
1 | df.to_csv(file_name, sep='\t') |
要使用特定的编码(例如"utf-8"),请使用
1 | df.to_csv(file_name, sep='\t', encoding='utf-8') |
当使用
可以通过向
有点像:
1 | df.to_csv(file_name, encoding='utf-8', index=False) |
因此,如果数据帧对象类似于:
1 2 3 | Color Number 0 red 22 1 blue 10 |
csv文件将存储:
1 2 3 | Color,Number red,22 blue,10 |
而不是(当默认值
1 2 3 | ,Color,Number 0,red,22 1,blue,10 |
如果您在编码到"utf-8"时遇到问题,并且想要逐单元进行,您可以尝试以下操作。
Python 2
(其中"df"是数据帧对象。)
1 2 3 4 5 6 7 8 9 10 | 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 |
然后尝试:
1 | df.to_csv(file_name) |
您可以通过以下方式检查列的编码:
1 2 | for column in df.columns: print '{0} {1}'.format(str(type(df[column][0])),str(column)) |
警告:errors='ignore'将省略字符,例如
1 2 | IN: unicode('Regenexx\xae',errors='ignore') OUT: u'Regenexx' |
Python 3
1 2 3 4 5 6 7 8 9 10 | 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 |
如果你不想要索引。
1 | df.to_csv("out.csv", index=False) |
如果同时指定UTF-8编码,有时会遇到这些问题。我建议您在读取文件时指定编码,在写入文件时指定相同的编码。这可能会解决你的问题。
这可能不是这个案例的答案,但是因为我和.to-csv有相同的错误消息,所以我尝试了.tocsv("name.csv"),错误消息是不同的("sparedataframe"对象没有属性"tocsv")。因此,通过将数据帧转换为密集数据帧来解决这个问题。
1 | df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8') |