如何使用Pandas存储数据帧

2024-04-26 09:58:17 发布

您现在位置:Python中文网/ 问答频道 /正文

现在我每次运行脚本时都要导入一个相当大的CSV作为数据帧。有没有一个好的解决方案可以在两次运行之间保持数据帧的持续可用性,这样我就不必花那么多时间等待脚本运行?


Tags: csv数据脚本时间解决方案可用性保持数据
3条回答

最简单的方法是使用^{}pickle它:

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

然后可以使用以下命令将其加载回:

df = pd.read_pickle(file_name)

注意:在0.11.1之前,{}和load是实现这一目标的唯一方法(它们现在分别被弃用,取而代之的是to_pickleread_pickle)。


另一个流行的选择是使用HDF5pytables),它为大型数据集提供very fast访问时间:

store = HDFStore('store.h5')

store['df'] = df  # save it
store['df']  # load it

更高级的策略在cookbook中讨论。


自0.13以来,还有msgpack这可能更好地实现互操作性,作为JSON的更快替代,或者如果您有python对象/文本繁重的数据(请参见this question)。

尽管已经有了一些答案,我还是找到了一个很好的比较,他们尝试了几种序列化Pandas数据帧的方法:Efficiently Store Pandas DataFrames

他们比较:

  • pickle:原始ASCII数据格式
  • cPickle,一个C库
  • pickle-p2:使用较新的二进制格式
  • json:standardlib json库
  • json没有索引:就像json,但是没有索引
  • msgpack:二进制JSON替代
  • CSV公司
  • hdfstore:HDF5存储格式

在他们的实验中,他们将一个包含1000000行的数据帧序列化,并分别测试两列:一列包含文本数据,另一列包含数字。他们的免责声明说:

You should not trust that what follows generalizes to your data. You should look at your own data and run benchmarks yourself

他们引用的测试的源代码是可用的online。由于这段代码不能直接工作,我做了一些小改动,您可以在这里得到:serialize.py 我得到了以下结果:

time comparison results

他们还提到,通过将文本数据转换为categorical数据,序列化速度要快得多。在他们的测试中大约是10倍的速度(也可以参见测试代码)。

编辑:pickle的次数高于CSV的次数可以用所使用的数据格式来解释。默认情况下,^{}使用可打印的ASCII表示,它生成更大的数据集。然而,从图中可以看出,使用较新的二进制数据格式(版本2,pickle-p2)的pickle具有更低的加载时间。

其他一些参考资料:

如果我理解正确,您已经在使用pandas.read_csv(),但希望加快开发过程,这样您就不必每次编辑脚本时都加载文件,对吗?我有几个建议:

  1. 在进行开发时,您可以使用pandas.read_csv(..., nrows=1000)只加载CSV文件的一部分,以只加载表的顶部位

  2. 使用ipython进行交互式会话,以便在编辑和重新加载脚本时将pandas表保留在内存中。

  3. 将csv转换为HDF5 table

  4. 更新的使用DataFrame.to_feather()pd.read_feather()以超级快的R兼容feather二进制格式存储数据(在我看来,比数字数据上的pandas.to_pickle()稍快,字符串数据上的pandas.to_pickle()快得多)。

您可能还对stackoverflow上的this answer感兴趣。

相关问题 更多 >