将pandas DataFrame写入CSV文件

时间:2013-06-04 16:46:56

标签: python csv pandas dataframe

我在pandas中有一个数据帧,我想写一个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'方法(我认为不存在)?

10 个答案:

答案 0 :(得分:833)

要通过标签分隔,您可以使用to_csvsep参数:

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

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

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

答案 1 :(得分:181)

使用DataFrame方法将to_csv对象存储到 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 :(得分:16)

如果您遇到与#ut;-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))

警告:错误='忽略'只会省略字符,例如

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

答案 3 :(得分:15)

如果您不需要索引。

 df.to_csv("out.csv", index=False)

答案 4 :(得分:9)

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:2)

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

这是一张表格,列出了一些写入CSV文件的常见情况以及可以用于它们的相应参数。

Write to CSV ma dude

  

脚注

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

答案 7 :(得分:2)

在Windows中使用完整路径导出文件的示例,如果文件具有标题

res

例如,如果您想存储在脚本所在目录的文件夹中,并以 utf-8编码选项卡作为分隔符

df.to_csv (r'C:\Users\John\Desktop\export_dataframe.csv', index = None, header=True) 

答案 8 :(得分:0)

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

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

答案 9 :(得分:-1)

对于简单的csv数据框。在您的问题中还提供答案。这不是上述错误的答案

df.to_csv('output.csv')

我发帖是因为我在上面的答案中找到了csv的d​​f,它显示了错误。