我可以用熊猫附加到压缩流吗?

Posted

技术标签:

【中文标题】我可以用熊猫附加到压缩流吗?【英文标题】:Can I append to a compressed stream with pandas? 【发布时间】:2016-12-03 22:49:27 【问题描述】:

我知道通过将 compression='gzip' 参数传递给 pd.to_csv() 我可以将 DataFrame 保存到压缩的 CSV 文件中。

my_df.to_csv('my_file_name.csv', compression='gzip')

我也知道,如果我想追加一个 DataFrame 到现有 CSV 文件的末尾,我可以使用 mode='a',就像这样

my_df.to_csv('my_file_name.csv', mode='a', index=False)

但是如果我想在压缩的 CSV 文件的末尾附加一个 DataFrame 怎么办?这甚至可能吗?我试着这样做

my_df.to_csv('my_file_name.csv', mode='a', index=False, compression='gzip')

但是生成的 CSV 没有被压缩,尽管状态很好。


这个问题的动机是我使用 Pandas 处理一个大型 CSV 文件。我需要生成压缩的 CSV 输出,并将 CSV 文件分块处理到 DataFrame 中,这样我就不会遇到 MemoryError。因此,对我来说最合乎逻辑的做法是将每个输出 DataFrame 块一起附加到一个压缩的 zip 文件中。

我正在使用 Python 3.4 和 Pandas 0.16.1。

【问题讨论】:

在 pandas 0.18.1 中附加 gzipped 数据框对我有用。你也可以concatenate gzipped files。 【参考方案1】:

最新答案:使用 pandas 1.2.4 为我工作

代码:

df.to_csv('test.csv', mode='a', compression='gzip')
new_df = pd.read_csv('test.csv', compression='gzip')

df.shape[0] # 1x
new_df.shape[0] # 2x

【讨论】:

【参考方案2】:

您可以执行以下操作

import gzip

with gzip.open('my_file_name.csv.gz', 'a') as compressed_file:
    df.to_csv(compressed_file, index=False)

因为 pandas .to_csv 方法接受路径或类似文件的对象。

【讨论】:

不适用于 python 3.6.9、pandas 0.25.3:TypeError: memoryview: a bytes-like object is required, not 'str' 这是如何解决的。我遇到了同样的错误。 compressed_file.write(df.to_csv().encode()) 现在可以使用了。【参考方案3】:

上面的答案似乎不再起作用了。当df.to_csv() 没有传递路径或类似文件的对象时,它会将数据帧作为字符串返回。这可以编码并写入 gzip 文件。

import gzip

with gzip.open('my_file_name.csv.gz', 'a') as compressed_file:
    compressed_file.write(df.to_csv().encode())

【讨论】:

以上是关于我可以用熊猫附加到压缩流吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何用列表分解熊猫数据框以用相同的ID标记同一行中的那些?

是否可以将熊猫系列附加到列表中

无法将熊猫数据框附加到现有的 Excel 工作表

使用熊猫将数据框附加到excel

将 tfidf 附加到熊猫数据框

在熊猫中连接/附加许多数据帧