如何可逆地将Pandas dataframe存储到磁盘中,并从磁盘中加载。

27 浏览
0 Comments

如何可逆地将Pandas dataframe存储到磁盘中,并从磁盘中加载。

现在我每次运行脚本时都要导入一个相当大的CSV数据框。有没有一个好的解决方案可以在运行之间一直保持数据框可用,这样我就不必花费所有的时间等待脚本运行完成了。

admin 更改状态以发布 2023年5月22日
0
0 Comments

虽然已经有些答案了,但我发现了一个很好的比较,他们尝试了几种序列化Pandas DataFrames的方法:Efficiently Store Pandas DataFrames

他们进行了比较:

  • pickle:原始ASCII数据格式
  • cPickle:一个C库
  • pickle-p2:使用较新的二进制格式
  • json:标准库Json库
  • json-no-index:类似于Json,但没有索引
  • msgpack:二进制Json替代品
  • CSV
  • hdfstore:HDF5存储格式

在他们的实验中,序列化了一个DataFrame,行数为1,000,000,测试了两列,分别是文本数据和数字数据。他们的免责声明说:

你不应该相信下面的内容适用于你的数据。你应该查看你自己的数据并自己运行基准测试。

他们提到的测试代码在这里。由于这段代码不能直接工作,所以我进行了一些微小的更改,你可以在这里找到。

我得到了以下结果:

time comparison results

他们还提到,将文本数据转换为分类数据后,序列化速度会快得多。在他们的测试中,快了大约10倍(也可以看看测试代码)。

编辑:相较于CSV,pickle的较高时间可以解释为采用的数据格式不同。默认情况下,pickle采用可打印的ASCII表示形式,这会生成更大的数据集。然而,从图表可以看出,采用新的二进制数据格式(版本2,pickle-p2)的pickle具有更低的加载时间。

其他一些参考资料:

0
0 Comments

最简单的方式是使用 pickle 并使用 to_pickle 进行存储:

df.to_pickle(file_name)  # where to save it, usually as a .pkl

然后可以使用以下方式加载:

df = pd.read_pickle(file_name)

注意:在 0.11.1 以前,只有使用 saveload 两个方法才能实现这个功能(现在已废弃,建议使用 to_pickleread_pickle)。


另一个流行的选择是使用 HDF5pytables),它为大型数据集提供了非常快速的访问速度:

import pandas as pd
store = pd.HDFStore('store.h5')
store['df'] = df  # save it
store['df']  # load it

更高级的策略在 手册 中讨论。


从0.13开始,还有 msgpack,可能更适合互操作性,是 JSON 的更快捷的替代品,或者如果您有 python 对象/文本重的数据(参见 这个问题)。

0