如何可逆地将Pandas dataframe存储到磁盘中,并从磁盘中加载。
如何可逆地将Pandas dataframe存储到磁盘中,并从磁盘中加载。
现在我每次运行脚本时都要导入一个相当大的CSV
数据框。有没有一个好的解决方案可以在运行之间一直保持数据框可用,这样我就不必花费所有的时间等待脚本运行完成了。
虽然已经有些答案了,但我发现了一个很好的比较,他们尝试了几种序列化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,测试了两列,分别是文本数据和数字数据。他们的免责声明说:
你不应该相信下面的内容适用于你的数据。你应该查看你自己的数据并自己运行基准测试。
他们提到的测试代码在这里。由于这段代码不能直接工作,所以我进行了一些微小的更改,你可以在这里找到。
我得到了以下结果:
他们还提到,将文本数据转换为分类数据后,序列化速度会快得多。在他们的测试中,快了大约10倍(也可以看看测试代码)。
编辑:相较于CSV,pickle的较高时间可以解释为采用的数据格式不同。默认情况下,pickle
采用可打印的ASCII表示形式,这会生成更大的数据集。然而,从图表可以看出,采用新的二进制数据格式(版本2,pickle-p2
)的pickle具有更低的加载时间。
其他一些参考资料:
- 在问题“快速读取CSV文件的Python库”中,有一个非常详细的答案,比较了使用基准测试方法读取csv文件的不同库。结果表明,在读取CSV文件方面,
numpy.fromfile
是最快的。 - 另一个序列化测试显示msgpack、ujson和cPickle是序列化最快的。
最简单的方式是使用 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 以前,只有使用 save
和 load
两个方法才能实现这个功能(现在已废弃,建议使用 to_pickle
和 read_pickle
)。
另一个流行的选择是使用 HDF5(pytables),它为大型数据集提供了非常快速的访问速度:
import pandas as pd store = pd.HDFStore('store.h5') store['df'] = df # save it store['df'] # load it
更高级的策略在 手册 中讨论。
从0.13开始,还有 msgpack,可能更适合互操作性,是 JSON 的更快捷的替代品,或者如果您有 python 对象/文本重的数据(参见 这个问题)。