我可以用熊猫附加到压缩流吗?
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())
【讨论】:
以上是关于我可以用熊猫附加到压缩流吗?的主要内容,如果未能解决你的问题,请参考以下文章