现在,每次运行脚本时,我都会导入一个相当大的CSV作为数据框架。是否有一个好的解决方案来保持数据帧在运行之间不断可用,这样我就不必花费所有的时间等待脚本运行?
当前回答
虽然已经有一些答案,我找到了一个很好的比较,他们尝试了几种方法来序列化熊猫数据框架:有效地存储熊猫数据框架。
他们比较:
pickle:原始ASCII数据格式 cPickle,一个C库 Pickle-p2:使用更新的二进制格式 Json: standardlib Json库 json-no-index:类似json,但没有索引 msgpack:二进制JSON替代品 CSV hdfstore: HDF5存储格式
在他们的实验中,他们序列化了一个包含1,000,000行的DataFrame,并分别测试了两列:一列是文本数据,另一列是数字。他们的免责声明说:
您不应该相信以下内容适用于您的数据。您应该查看自己的数据并自己运行基准测试
他们提到的测试源代码可以在网上找到。由于这段代码不能直接工作,我做了一些小更改,您可以在这里看到:serialize.py 我得到了以下结果:
他们还提到,通过将文本数据转换为分类数据,序列化速度要快得多。在他们的测试中,大约是10倍的速度(另见测试代码)。
编辑:pickle的时间比CSV的时间长可以用所使用的数据格式来解释。默认情况下,pickle使用可打印的ASCII表示,这会生成更大的数据集。然而,从图中可以看出,使用更新的二进制数据格式(版本2,pickle-p2)的pickle加载时间要短得多。
其他参考资料:
在“最快的Python库来读取CSV文件”这个问题中,有一个非常详细的答案,它比较了不同的库来读取CSV文件的基准。结果是,对于读取csv文件,numpy.fromfile是最快的。 另一个序列化测试 显示msgpack, usjson和cPickle在序列化中是最快的。
其他回答
最简单的方法是使用to_pickle来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对象/文本较多的数据(参见这个问题)。
这里有很多很棒和充分的答案,但我想发布一个我在Kaggle上使用的测试,这个测试用不同的pandas兼容格式保存和读取大df:
https://www.kaggle.com/pedrocouto39/fast-reading-w-pickle-feather-parquet-jay
我不是作者,也不是作者的朋友,然而,当我读到这个问题时,我觉得值得一提。
CSV: 1分42秒泡菜:4.45秒羽毛:4.35秒拼花:8.31秒杰伦:8.12毫秒 或者0.0812秒(超快的!)
如前所述,有不同的选项和文件格式(HDF5, JSON, CSV, parquet, SQL)来存储数据帧。然而,pickle不是一级公民(取决于你的设置),因为:
泡菜是一个潜在的安全隐患。形成pickle的Python文档:
警告pickle模块不安全 恶意构造的数据。对象接收的数据永远不能解pickle 不受信任或未经身份验证的源。
泡菜很慢。找到这里和这里的基准。
根据您的设置/使用情况,这两个限制都不适用,但我不建议将pickle作为pandas数据帧的默认持久性。
Arctic是一个高性能的Pandas, numpy和其他数值数据的数据存储。它位于MongoDB之上。也许对于OP来说有点过分了,但对于其他无意中看到这篇文章的人来说,值得一提
如果我理解正确的话,你已经在使用pandas.read_csv(),但想要加快开发过程,这样你就不必每次编辑脚本时都加载文件,对吗?我有一些建议:
you could load in only part of the CSV file using pandas.read_csv(..., nrows=1000) to only load the top bit of the table, while you're doing the development use ipython for an interactive session, such that you keep the pandas table in memory as you edit and reload your script. convert the csv to an HDF5 table updated use DataFrame.to_feather() and pd.read_feather() to store data in the R-compatible feather binary format that is super fast (in my hands, slightly faster than pandas.to_pickle() on numeric data and much faster on string data).
您可能还会对stackoverflow上的答案感兴趣。
推荐文章
- 如何从Python函数中返回两个值?
- 前一个月的Python日期
- Python中方括号括起来的列表和圆括号括起来的列表有什么区别?
- Python日志记录不输出任何东西
- 每n秒运行特定代码
- SQLAlchemy是否有与Django的get_or_create等价的函数?
- 如何将python datetime转换为字符串,具有可读格式的日期?
- 美丽的汤和提取div及其内容的ID
- 在Python中重置生成器对象
- 用Python构建最小的插件架构
- model.eval()在pytorch中做什么?
- Tensorflow 2.0:模块“Tensorflow”没有属性“Session”
- 从环境文件中读入环境变量
- 在OSX 10.11中安装Scrapy时,“OSError: [Errno 1]操作不允许”(El Capitan)(系统完整性保护)
- 如何删除熊猫数据帧的最后一行数据