【问题标题】:How to save a pandas dataframe in gzipped format directly? [duplicate]如何直接以压缩格式保存熊猫数据框? [复制]
【发布时间】:2012-10-23 14:54:07
【问题描述】:

我有一个名为 df 的 pandas 数据框。

我想以 gzip 格式保存它。一种方法如下:

import gzip
import pandas

df.save('filename.pickle')
f_in = open('filename.pickle', 'rb')
f_out = gzip.open('filename.pickle.gz', 'wb')
f_out.writelines(f_in)
f_in.close()
f_out.close()

但是,这需要我首先创建一个名为filename.pickle 的文件。 有没有办法更直接地做到这一点,即不创建filename.pickle

当我想加载已压缩的数据框时,我必须执行相同的操作 创建 filename.pickle 的步骤。例如,读取文件 filename2.pickle.gzip,这是一个 gzipped pandas 数据框,我知道以下方法:

f_in = gzip.open('filename2.pickle.gz', 'rb')
f_out = gzip.open('filename2.pickle', 'wb')
f_out.writelines(f_in)
f_in.close()
f_out.close()

df2 = pandas.load('filename2.pickle')

不先创建filename2.pickle 可以做到这一点吗?

【问题讨论】:

  • 您将短语“压缩”和“压缩格式”与使用 gzip 的代码混合在一起,这是不正确的。 zip 和 gzip (.gz) 是两种不同的、不兼容的格式。如果您真的想要 zip 格式,那么 gzip 代码不会为您执行此操作。如果您想要 gzip 格式的数据,则将其称为 gzipped,而不是 zipped。
  • 我想要压缩包。我想摆脱创建非压缩文件的中间步骤。我已经更正了使用的术语。
  • @Curious2learn 此答案的信息已更改。您介意查看答案并接受新答案吗?

标签: python gzip pandas


【解决方案1】:

Pandas 最近添加了更好的压缩序列化功能。 (从 pandas 0.20.0 开始。)以下是如何使用它的示例:

df.to_csv("my_file.gz", compression="gzip")

如需了解更多信息,例如可用的不同压缩形式,check out the docs

【讨论】:

    【解决方案2】:

    由于某种原因,Python zlib module 能够解压缩 gzip 数据,但它不具备直接压缩到该格式的能力。至少就记录在案的内容而言。尽管文档页面标题“与 gzip 兼容的压缩”具有明显的误导性。

    您可以使用zlib.compresszlib.compressobj 压缩到zlib format,然后剥离zlib 标头和尾部并添加gzip 标头和尾部,因为zlib 和gzip 格式都使用相同的compressed data format .这将为您提供gzip format 中的数据。 zlib 标头固定为两个字节,尾部固定为四个字节,因此很容易剥离。然后,您可以在前面添加一个 10 个字节的基本 gzip 标头:"\x1f\x8b\x08\0\0\0\0\0\0\xff"(C 字符串格式)并以 little-endian 顺序添加一个 4 字节的 CRC。可以使用zlib.crc32 计算CRC。

    【讨论】:

    • 谢谢,马克。我实际上并不太关心压缩格式,只要它在速度和大小上都不错(不一定是最好的)。如果是这样,我可以直接使用 zlib 吗?我还将查看 zlib 文档。再次感谢。
    • 是的,您可以直接将 zlib 格式与 Python zlib 模块一起使用。它是相同的压缩器,并被 gzip 使用,因此压缩相同,减去 8 个字节的标头。
    • 马克,我看到的唯一例子是字符串被压缩的地方。我没有看到压缩和保存 pandas 数据框的示例。这可以做到吗?谢谢。
    • 我不知道什么是数据框,但你应该可以使用 pickle.dumps 将任何对象转换为字符串。
    【解决方案3】:

    您可以使用 pickle.dumps 将数据帧转储到字符串中,然后使用以下命令将其写入磁盘 导入压缩包

    file = gzip.GzipFile('filename.pickle.gz', 'wb', 3)
    file.write(pickle.dumps(df))
    file.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 2021-09-06
      • 2019-10-11
      • 2015-04-28
      • 1970-01-01
      • 2020-08-03
      • 2013-02-07
      相关资源
      最近更新 更多