ChatGPT解决这个技术问题 Extra ChatGPT

将 pandas DataFrame 写入 CSV 文件

我在 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?


A
Andy Hayden

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

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

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

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

我会添加 index=False 以删除索引。
我最初对如何找到我 7 年前已经写过的问题的答案感到困惑。
对使用该功能的其他人来说只是一个小提示:以 .csv 结束您的文件名 我不承认有多少次我忘记这样做了。
除了 OP 请求之外,我们使用 to_csv 来编写制表符分隔文件是否有特殊原因?
c
cs95

当您使用 to_csv 方法将 DataFrame 对象存储到 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

如果需要索引,但也应该有标题怎么办?你只使用 df.rename_axis('index_name') 吗?不会改变文件本身
如何在文件末尾获取 CR / 空行? stackoverflow.com/questions/39237755/… 其他问题的答案无效。
C
Community

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

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

https://i.stack.imgur.com/RsIO7.png

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


S
Singh

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

G
Glen Thompson

如果您在编码为“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

T
Tadhg McDonald-Jensen

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


n
nucsit026

这可能不是这种情况的答案,但由于我与 .to_csv 有相同的错误消息,我尝试了 .toCSV('name.csv') 并且错误消息不同(“SparseDataFrame' object has no attribute 'toCSV')。所以通过转动数据框解决了问题密集数据框

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

您在第二个中遇到了错误,因为您使用的是 .toCSV 而不是 .to_csv。你忘了下划线
M
Marc Compte

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

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

如果我的脚本在服务器上运行,我需要在每次运行时创建一个新的 csv 并提供到服务器的路径。如何做到这一点以及如何在创建后删除文件? (创建>阅读>删除?
不确定,实际上没有这样做的经验
R
Ruwindhu Chandraratne

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

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