【问题标题】:Writing a pandas DataFrame to CSV file将 pandas DataFrame 写入 CSV 文件
【发布时间】:2013-05-31 04:05:41
【问题描述】:

我在 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' 方法(我认为不存在)?

【问题讨论】:

    标签: python csv pandas dataframe


    【解决方案1】:

    要通过制表符分隔,您可以使用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结束您的文件名我不承认我忘记了多少次。
    • 我们使用to_csv 来编写制表符分隔文件是否有特殊原因,而不是 OP 要求的?
    【解决方案2】:

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

    您可以通过将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/… 其他问题的答案无效。
    【解决方案3】:

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

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

    脚注

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

    【讨论】:

      【解决方案4】:

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

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

      例如,如果您想将文件存储在脚本所在的同一目录中,使用 utf-8 编码tab 作为分隔符

      df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header='true')
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            这可能不是这种情况的答案,但由于我与 .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。你忘了下划线
            【解决方案8】:

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

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

            【讨论】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-12-31
              • 1970-01-01
              • 2014-02-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多