12

我有一个 pandas 数据框,名为df.

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

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?

当我想加载已被 gzip 压缩的数据框时,我必须完成创建 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先创建的情况下完成吗?

4

3 回答 3

16

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

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

有关更多信息,例如可用的不同压缩形式,请查看文档

于 2016-05-19T15:33:49.500 回答
2

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

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

于 2012-10-23T15:18:42.117 回答
1

您可以使用 pickle.dumps 将数据帧转储到字符串中,然后使用 import gzip 将其写入磁盘

file = gzip.GzipFile('filename.pickle.gz', 'wb', 3)
file.write(pickle.dumps(df))
file.close()
于 2013-06-22T22:03:33.303 回答