关于python:pandas将数据帧写入csv文件

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来写入以制表符分隔的文件?


要用制表符定界,可以使用to_csvsep参数:

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

要使用特定的编码(例如"utf-8"),请使用encoding参数:

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


当使用to_csv方法将DataFrame对象存储到csv文件中时,可能不需要存储DataFrame对象每行的前面索引。

可以通过向index参数传递False布尔值来避免这种情况。

有点像:

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

而不是(当默认值True通过时)

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')