将熊猫数据帧写入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?
2066986 次浏览

要通过制表符分隔,您可以使用to_csvsep参数:

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

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

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

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

如果您在编码为“utf-8”时遇到问题并且想要逐个单元格,您可以尝试以下方法。

python2

(其中“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))

警告:错误='忽略'只会省略字符。

IN: unicode('Regenexx\xae',errors='ignore')OUT: u'Regenexx'

python3

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布尔值传递给index参数来避免

有点像:

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

因此,如果您的DataFrame对象类似于:

  Color  Number0   red     221  blue     10

csv文件将存储:

Color,Numberred,22blue,10

而不是(默认值True通过时的情况)

,Color,Number0,red,221,blue,10

这可能不是这种情况的答案,但由于我与.to_csv有相同的错误消息,我尝试了.toCSV('name.csv'),错误消息不同("SparseDataFrame' object has no attribute 'toCSV')。因此,通过将数据帧转换为密集数据帧来解决问题

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

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

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

写CSV我哥们

脚注

  1. 默认分隔符被假定为逗号(',')。除非您知道需要,否则不要更改它。
  2. 默认情况下,df的索引被写入第一列。如果您的DataFrame没有索引(IOW,df.index是默认的RangeIndex),那么您需要在写入时设置index=False。换句话说,如果您的数据确实有索引,您可以(并且应该)使用index=True或完全省略它(因为默认值是True)。
  3. 如果您正在编写字符串数据,则设置此参数是明智的,以便其他应用程序知道如何读取您的数据。这也将避免您在保存时可能遇到的任何潜在UnicodeEncodeError
  4. 如果您将大型DataFrames(>100K行)写入磁盘,建议使用压缩,因为它会导致更小的输出文件。OTOH,这将意味着写入时间将增加(因此,读取时间,因为文件需要解压缩)。

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

如果上述解决方案不适用于任何人或CSV变得混乱,只需像这样从行中删除sep='\t'

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

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

df.to_csv(file_name,编码='utf-8')