915

我在 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 字符)?
  • 有没有办法使用例如'to-tab'方法(我认为不存在)写入制表符分隔文件而不是CSV?
4

9 回答 9

1276

要通过制表符分隔,您可以使用以下sep参数to_csv

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

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

df.to_csv(file_name, sep='\t', encoding='utf-8')
于 2013-06-04T16:52:17.853 回答
322

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

您可以通过将布尔值传递给参数来避免这种情况。Falseindex

有点像:

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
于 2017-07-17T10:27:18.440 回答
41

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

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

写到 CSV 马哥们

脚注

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

在 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')
于 2019-08-08T12:23:16.897 回答
21

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

蟒蛇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'

蟒蛇 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
于 2017-01-18T21:00:59.830 回答
15

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

于 2016-05-19T13:02:46.023 回答
9

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

df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')
于 2018-01-26T15:35:36.063 回答
3

如果上述解决方案对任何人都不起作用或 CSV 被弄乱了,只需sep='\t'像这样从行中删除:

df.to_csv(file_name, encoding='utf-8')
于 2021-04-27T09:37:40.547 回答
0

我会避免单独使用 '\t' 并在再次读取数据集时会产生问题。

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

于 2022-02-09T17:34:00.347 回答