gpt4 book ai didi

python - 为什么 df.to_pickle 和 native Python pickle 之间的 pd.DataFrame pickle 大小差异如此之大?

转载 作者:太空宇宙 更新时间:2023-11-04 03:15:48 25 4
gpt4 key购买 nike

我有一个具有以下结构的 Pandas 数据框 (pd.DataFrame):

In [175]: df.dtypes.value_counts()
Out[175]:
int64 876
float64 206
object 76
bool 9
dtype: int64

In [176]: df.shape
Out[176]: (9764, 1167)

我通过以下三种方式将数据存储到磁盘:

In [170]: df.to_csv('df.csv')

In [171]: df.to_pickle('df_v1.pkl')

In [172]: import pickle
In [173]: with open('df_v2.pkl', 'wb') as handle:
.....: pickle.dump(df, handle)

磁盘上的文件大小如下:

df.csv:     26.4 MB 
df_v1.pkl: 90.5 MB
df_v2.pkl: 340.4 MB

csv 很小是可以理解的——它没有 pandas 开销可以保存(也就是说,它不必保存数据帧数据类型等)我不明白的是,为什么来自两种不同 pickle 方法的 pickle 在大小上相差如此之大!另外,一个比另一个更受欢迎吗?那么向后兼容性呢?

最佳答案

查看 source code对于 to_pickle ,pandas 在 pickle DataFrame 时会选择最有效的协议(protocol)。通过 default , pickle.dump使用 ASCII 协议(protocol),就文件大小而言,这是效率最低的协议(protocol)。这样做是为了确保兼容性,并使其更容易恢复,因为 ASCII 协议(protocol)是人类可读的。

您的代码的等效项是更改 pickle.dump线到:

pickle.dump(df, handle, protocol=pickle.HIGHEST_PROTOCOL)

我只想使用 to_pickle方法,因为它会产生更清晰的代码。不应该有任何向后兼容性问题,除非您需要与非常旧版本的 Python 兼容;越高效pickle协议(protocol)是在 Python 2.3 中引入的。

另外需要注意的是 pandas 使用 cPickle 为了提高性能,而不是 pickle本身。这不应该影响文件大小,但这是两者之间的另一个潜在差异。一般来说,你应该使用 cPickle尽可能只使用 picklecPickle 不支持您想做的事情时.

关于python - 为什么 df.to_pickle 和 native Python pickle 之间的 pd.DataFrame pickle 大小差异如此之大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36339501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com