问题:将pandas DataFrame写入CSV文件
我在熊猫中有一个数据框,我想将其写入CSV文件。我正在使用以下方法:
df.to_csv('out.csv')
并得到错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
有什么方法可以轻松解决此问题(即我的数据框中有Unicode字符)吗?是否有一种方法可以使用例如“ to-tab”方法(我认为不存在)写入制表符分隔的文件而不是CSV?
回答 0
要用制表符分隔,可以使用sep
参数to_csv
:
df.to_csv(file_name, sep='\t')
要使用特定的编码(例如’utf-8’),请使用encoding
参数:
df.to_csv(file_name, sep='\t', encoding='utf-8')
回答 1
当你存储DataFrame
对象转换成csv文件使用to_csv
方法,你大概不会需要存储前指数各行的DataFrame
对象。
您可以通过将布尔值传递给参数来避免这种情况。False
index
有点像:
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
回答 2
要将pandas DataFrame写入CSV文件,您将需要to_csv
您可以通过传递参数来满足这些要求。
下表列出了一些写入CSV文件的常见情况以及可以用于它们的相应参数。
脚注
- 默认分隔符假定为逗号(
','
)。除非您知道需要,否则请勿更改此设置。- 默认情况下,的索引
df
写为第一列。如果您的DataFrame没有索引(IOW,df.index
默认值为RangeIndex
),那么您将index=False
在写入时进行设置。以另一种方式解释这一点,如果您的数据确实有索引,则可以(并且应该)使用index=True
或完全不使用它(默认值为True
)。- 如果要写入字符串数据,则最好设置此参数,以便其他应用程序知道如何读取数据。这也将避免
UnicodeEncodeError
您在保存时可能遇到的任何潜在问题。- 如果要将大的DataFrame(> 100K行)写入磁盘,建议使用压缩,因为压缩会导致输出文件小得多。OTOH,这意味着写入时间将增加(因此,由于文件需要解压缩,因此读取时间也将增加)。
回答 3
如果您遇到编码为’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
回答 4
如果同时指定UTF-8编码,有时会遇到这些问题。我建议您在读取文件时指定编码,而在写入文件时指定相同的编码。这可能会解决您的问题。
回答 5
在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')
回答 6
它可能不是这种情况的答案,但由于我.to_csv
尝试过相同的错误消息,.toCSV('name.csv')
并且错误消息有所不同(“” SparseDataFrame' object has no attribute 'toCSV'
),因此通过将数据帧转换为密集数据帧来解决了问题。
df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')