【问题标题】:Append rows from pandas df to a new csv while preserving the headers once?将pandas df中的行附加到新的csv,同时保留标题一次?
【发布时间】:2019-05-02 01:30:46
【问题描述】:

我的目标是打开一个非常大的 csv 文件,读取该文件,然后对数据子集进行处理。在这种情况下,“stuff”正在写入一个空白的 csv,但将来它将在数据上运行函数,一次 200 行(由于某种原因,这节省了我的计算时间,通过运行整个 csv函数)。

我目前的问题是,当我写一个空白的csv时,如果我使用header = False,我没有标题,但如果我拿出那个命令,我每200行就有一个标题。如果可能的话,我希望标题在顶部一次?

with open(csvFile, encoding = 'utf8', errors = 'ignore') as csv_file:
chunksize = 200
i = 0
j = 1
for df in pd.read_csv(csv_file, encoding = 'utf-8', chunksize=chunksize, iterator=True):
      df.index += j
      i+=1
      df.to_csv('test.csv', mode = 'a', sep = ',', encoding='utf-8', header=False, index=False)
      j = df.index[-1] + 1  

【问题讨论】:

  • for df in pd.read_csv 是超级令人困惑的语法顺便说一句,因为它根本不是 df。出于所有意图和目的,该名称是为pandas.DataFrame() 保留的。
  • 其次,根据我对问题的理解,这是完全可能的,但我们缺少代码实际作用的细节
  • 不,实际上,我的 cmets 没有意义,但“(由于某种原因,这节省了我的计算时间,通过函数运行整个 csv)”。我现在会留下我的(不正确的)cmets,因为这是你的问题让我的想法下降的途径,但该声明暗示了一个更广泛的问题 IMO。我无法看到像这样以块的形式处理文件并追加出来会更快,除非您在不适合内存的 CSV 上处理内存
  • @roganjosh,注意read_csv 中的iterator=True。这会导致 read_csv 返回一个迭代器,而不是通过 for 循环循环时,将返回单个数据帧 (df)。
  • @Kyle 请在我编辑后查看我的最后一条评论。如果您看到我遗漏的内容,请添加到答案中,我会投票

标签: python python-3.x pandas loops export-to-csv


【解决方案1】:

在你第一次写的时候输入header=True

with open(csvFile, encoding = 'utf8', errors = 'ignore') as csv_file:
    chunksize = 200
    i = 0
    j = 1
    for df in pd.read_csv(csv_file, encoding = 'utf-8', chunksize=chunksize, iterator=True):
        df.index += j
        i += 1
        if i == 1:
            df.to_csv('test.csv', mode = 'w', sep = ',', encoding='utf-8', header=True, index=False)
        else:
            df.to_csv('test.csv', mode = 'a', sep = ',', encoding='utf-8', header=False, index=False)
        j = df.index[-1] + 1 

【讨论】:

  • df.to_csv('test.csv', mode = 'w', sep = ',', encoding='utf-8', header=i==1, index=False),您可以将 read_csv 包装在 enumerate 中以摆脱其他行。
【解决方案2】:

你可以import os使用,我没有写你所有的代码,但主要依据是

if os.path.exists(csv_file):
    headers=false
else:
    headers=true

【讨论】:

    猜你喜欢
    • 2021-02-23
    • 2022-11-28
    • 1970-01-01
    • 2018-10-29
    • 2021-11-28
    • 2011-10-02
    • 1970-01-01
    • 2021-04-01
    • 2022-01-25
    相关资源
    最近更新 更多