【问题标题】:How to force a new line when appending to a csv using python pandas .to_csv如何在使用 python pandas .to_csv 附加到 csv 时强制换行
【发布时间】:2017-03-25 09:20:01
【问题描述】:

附加到 csv 时,我的第一行从现有的最后一行开始,而不是新行。

我一直在搜索,但我只是找到了在追加模式下打开 csv 或在写入 csv 时使用追加模式的基本用途。我无法理解此处接受的答案 (to_csv append mode is not appending to next new line),因为它似乎需要在使用 f.write("/n") 写入 ("/n") 之前打开现有文件。这个答案(How to add pandas data to an existing csv file?)是最相关的,但我希望在一个函数中写入多个数据帧,所以我不想继续打开它们。我的计划是使用如下函数:

import os
def mysave(df,dfpath):
    # if file does not exist write header 
    if not os.path.isfile(dfpath):
        df.to_csv(dfpath, index = False)
    else: # else it exists so append without writing the header
        df.to_csv(dfpath, mode = 'a', index = False, header = False)

mysave(mydf, 'foo.csv')

我创建了一个非常简单的示例,带有 foo.csv 的结构:

a   b   c   d           
5   1   ah  doo         
6   2   bah poo         
7   2   dah coo

当我使用我的函数或这个简单的代码时:

import pandas as pd
df = pd.read_csv('foo.csv', index_col=False)
mydf = df
mydf.to_csv('foo.csv', mode='a', index = False, header = False)

这就是 foo.csv 的最终结果:

a   b   c   d           
5   1   ah  doo         
6   2   bah poo         
7   2   dah coo5    1   ah  doo
6   2   bah poo         
7   2   dah coo     

当我尝试添加回车符作为标题时,例如mydf.to_csv('foo.csv', mode='a', index = False, header = ("/n")) pandas(正确地)忽略了我错误的标题注释并使用默认值header = True

a   b   c   d           
5   1   ah  doo         
6   2   bah poo         
7   2   dah cooa    b   c   d
6   2   bah poo         
7   2   dah coo 

【问题讨论】:

    标签: python csv pandas


    【解决方案1】:

    我遇到了类似的问题,经过一番搜索后,我没有找到任何简单/优雅的解决方案。对我有用的最小修复是:

    import pandas as pd
    
    with open('foo.csv') as f:
        f.write('\n')    
    mydf.to_csv('foo.csv', index = False, header = False, mode='a')
    

    【讨论】:

      【解决方案2】:

      我假设您要将两个 dataframe 中的另一个附加到单个数据帧中。

      使用下面提到的命令使其成为单个命令

      ans = pd.concat([df, df])

      然后您可以将输出转换为 .csv 文件

      【讨论】:

      • 这个建议没有回答我的问题,但它确实解决了我潜在的实际问题。我目前按照你的建议做。我迭代地构建一个数据帧(按组的许多数据帧),然后我将它全部发送到一个.csv(按组)。 for mygroup in mygroups: d = pd.DataFrame() for k, v in mygroup: if k == x: #do something temp = makeMyDF(v) d = pd.concat([d, temp]) d.to_csv(filepath) 但是,我目前的流程需要 11 个小时。我希望尽量减少记忆。
      • 如果你的数据框很大,那么写入磁盘会有更大的窗口时间。在那些“磁盘写入窗口时间”期间,您可以使用多处理(线程)进行其他处理。但这取决于硬件,处理器。
      【解决方案3】:

      如果你的数据框变得很大并且你想避免串联,你可以选择

      import csv
      with open('foo.csv','ab') as out:
         writer=csv.writer(out)
         writer.writerow(())
      

      在函数中,或者只是作为代码中的 sn-p。如果您不在 Windows 上,也许您可​​以避免在 open 中添加“b”并仅使用“a”(附加)打开文件

      【讨论】:

      • 因此,此建议不能回答我的问题,但可以替代我的实际问题。我想我可以重新概念化我的方法来做你建议的事情,如果我在第一次制作(循环)之后打开 .csv 然后将临时数据帧发送到打开的 csv。但是,它会比仅在 python 中构建数据框并将“整个事物”发送到 csv 一次更快吗?
      • 如果你要处理小数据帧,这个 IMO 不值得花时间重构甚至测试,但是如果你发现自己处于连接过程很昂贵的情况,那么我想那会更快。如果您有时间进行测试,请告诉我。
      • 我真的没有小数据框。我计划在弄清楚如何执行此附加后进行测试。无需滑动数据框的第一行。目前,我的过程需要 11 个小时,共 25 个组。诚然,大部分时间都在 xlwings 中,因为我迭代地将输入更改为 Excel 工具(不是我的工作),但我认为其中一些是将数据帧保存在内存中。
      • 对于可管理数量的数据帧,另一种方法是您可以在不进行大量重构的情况下解决此问题,就像现在一样将每个数据帧写入 csv,当您完成后将它们全部连接起来,这样您的问题就变成了更简单的一个。哈克,但如果一切都失败了..
      猜你喜欢
      • 2017-03-22
      • 2020-12-04
      • 2018-05-24
      • 2014-02-20
      • 1970-01-01
      • 2018-04-14
      • 2018-05-16
      • 2019-07-29
      • 2020-03-16
      相关资源
      最近更新 更多