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


当前回答

如果还指定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

如果还指定UTF-8编码,有时也会遇到这些问题。 我建议您在读取文件时指定编码,在写入文件时指定相同的编码。 这可能会解决你的问题。

我会避免使用“\t”分隔符,这会在再次读取数据集时产生问题。

df。to_csv (file_name、编码=“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')