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


当前回答

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

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

如果还指定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方法将DataFrame对象存储到csv文件中时,您可能不需要存储DataFrame对象的每一行的前面索引。

你可以通过给索引参数传递一个False布尔值来避免这种情况。

有点像:

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

如果你的DataFrame对象是这样的:

  Color  Number
0   red     22
1  blue     10

csv文件将存储:

Color,Number
red,22
blue,10

而不是(当传递默认值True时的情况)

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

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

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