我有一个熊猫的数据框架,我想写一个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'方法(我不认为存在)?


当前回答

要用制表符分隔,可以使用to_csv的sep参数:

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

使用特定的编码(例如:'utf-8')使用encoding参数:

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

其他回答

如果你有编码到'utf-8'的问题,想要逐个单元格,你可以尝试以下方法。

Python 2

(df是你的DataFrame对象。)

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

它可能不是这种情况下的答案,但因为我有相同的错误消息与.to_csv尝试.toCSV('name.csv')和错误消息是不同的("SparseDataFrame'对象没有属性'toCSV')。因此,通过将数据帧转换为密集数据帧解决了这个问题

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

要用制表符分隔,可以使用to_csv的sep参数:

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

使用特定的编码(例如:'utf-8')使用encoding参数:

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

要将pandas DataFrame写入CSV文件,您需要DataFrame.to_csv。此函数提供了许多具有合理默认值的参数,您通常需要重写这些参数以适应特定的用例。例如,您可能希望使用不同的分隔符、更改datetime格式或在写入时删除索引。To_csv具有参数,您可以传递这些参数来满足这些需求。

下面的表格列出了写入CSV文件的一些常见场景,以及您可以为它们使用的相应参数。

Footnotes The default separator is assumed to be a comma (','). Don't change this unless you know you need to. By default, the index of df is written as the first column. If your DataFrame does not have an index (IOW, the df.index is the default RangeIndex), then you will want to set index=False when writing. To explain this in a different way, if your data DOES have an index, you can (and should) use index=True or just leave it out completely (as the default is True). It would be wise to set this parameter if you are writing string data so that other applications know how to read your data. This will also avoid any potential UnicodeEncodeErrors you might encounter while saving. Compression is recommended if you are writing large DataFrames (>100K rows) to disk as it will result in much smaller output files. OTOH, it will mean the write time will increase (and consequently, the read time since the file will need to be decompressed).

在Windows上导出全路径文件的例子,如果你的文件有头文件:

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

例如,如果你想将文件存储在脚本所在的目录中,使用utf-8编码和制表符作为分隔符:

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