【问题标题】:Writing large Pandas Dataframes to CSV file in chunks将大型 Pandas 数据帧分块写入 CSV 文件
【发布时间】:2023-03-25 18:09:01
【问题描述】:

如何将大数据文件分块写入 CSV 文件?

我有一组大型数据文件(1M 行 x 20 列)。但是,我对这些数据中只有大约 5 列感兴趣。

我想通过仅使用感兴趣的列来制作这些文件的副本来使事情变得更容易,因此我可以使用较小的文件进行后期处理。所以我打算将文件读入数据框,然后写入 csv 文件。

我一直在研究将大型数据文件分块读取到数据框中。但是,我还没有找到任何关于如何将数据分块写入 csv 文件的信息。

这是我现在正在尝试的,但这不会附加 csv 文件:

with open(os.path.join(folder, filename), 'r') as src:
    df = pd.read_csv(src, sep='\t',skiprows=(0,1,2),header=(0), chunksize=1000)
    for chunk in df:
        chunk.to_csv(os.path.join(folder, new_folder,
                                  "new_file_" + filename), 
                                  columns = [['TIME','STUFF']])

【问题讨论】:

    标签: python pandas dataframe export-to-csv large-data


    【解决方案1】:

    解决方案:

    header = True
    for chunk in chunks:
    
        chunk.to_csv(os.path.join(folder, new_folder, "new_file_" + filename),
            header=header, cols=[['TIME','STUFF']], mode='a')
    
        header = False
    

    注意事项:

    • mode='a' 告诉 pandas 追加。
    • 我们只在第一个块上写一个列标题。

    【讨论】:

    • 你错过了 os.path.join 的要点:os.path.join(folder, new_folder, "new_file_" + filename)
    • 感谢收看!
    • 我注意到,当我使用 mode='a' 追加时,列标签写在每个块之后。如何确保列标签只出现在文件的开头?
    • 您可以将 header=None 传递给除第一个块之外的所有块
    • 你可以先for i, chunk in chunks:,然后header=(i==0)
    【解决方案2】:

    为什么不只阅读感兴趣的列然后保存呢?

    file_in = os.path.join(folder, filename)
    file_out = os.path.join(folder, new_folder, 'new_file' + filename)
    
    df = pd.read_csv(file_in, sep='\t', skiprows=(0, 1, 2), header=0, names=['TIME', 'STUFF'])
    df.to_csv(file_out)
    

    【讨论】:

    • 以防万一我遇到太大的文件,我必须以块的形式读取。我不相信你的代码会允许我这样做,对吗?
    • 正确,但它仍然效率更高。如果是这种情况,您仍然需要分块或使用 csv 模块。
    【解决方案3】:

    查看to_csv 方法中的chunksize 参数。 Here 是文档。

    写入文件如下所示:

    df.to_csv("path/to/save/file.csv", chunksize=1000, cols=['TIME','STUFF'])
    

    【讨论】:

    • 嗯,我使用你提出的方法得到了以下错误:AttributeError: 'TextFileReader' object has no attribute 'to_csv' 你的答案仍然假设我正在分块读取“df”?
    • 这是一个完整的DataFrame。
    • 这在将巨大的数据帧从一个文件流式传输到另一个文件时没有帮助,在这种情况下 mode='a' 更好。
    • @denfromufa 确定吗? chunksize 可能意味着分批写入,不是吗?然后无论如何都必须在append 模式下完成。还是我错过了什么?不过,我不知道技术细节,只是猜测。有没有人对此有更深入的了解,这与带有循环的公认答案相同吗?
    • 我可以保证这对 700000 行的 50 MB 文件有效,块大小为 5000,比循环批处理的普通 csv 写入器快很多倍。我没有像接受的答案那样检查append 模式下的数据帧循环,但至少这个答案不会是坏的。将 Cloud Function 时间从之前的 >9 分钟超时限制降低到 62 秒(我什至不知道写入所有数据需要多长时间,但显然更长)。
    猜你喜欢
    • 2020-03-24
    • 2018-03-01
    • 2014-01-21
    • 2021-04-17
    • 2016-02-22
    • 1970-01-01
    • 2021-09-06
    • 2019-09-20
    • 2023-02-21
    相关资源
    最近更新 更多