现在,每次运行脚本时,我都会导入一个相当大的CSV作为数据框架。是否有一个好的解决方案来保持数据帧在运行之间不断可用,这样我就不必花费所有的时间等待脚本运行?
当前回答
Numpy文件格式对于数字数据来说非常快
我更喜欢使用numpy文件,因为它们快速且易于使用。 下面是一个简单的基准测试,用于保存和加载一个包含100万个点的1列数据框架。
import numpy as np
import pandas as pd
num_dict = {'voltage': np.random.rand(1000000)}
num_df = pd.DataFrame(num_dict)
使用ipython的%%timeit魔法函数
%%timeit
with open('num.npy', 'wb') as np_file:
np.save(np_file, num_df)
输出为
100 loops, best of 3: 5.97 ms per loop
将数据加载回数据框架
%%timeit
with open('num.npy', 'rb') as np_file:
data = np.load(np_file)
data_df = pd.DataFrame(data)
输出为
100 loops, best of 3: 5.12 ms per loop
不坏!
CONS
如果您使用python 2保存numpy文件,然后尝试使用python 3打开,则会出现问题(反之亦然)。
其他回答
https://docs.python.org/3/library/pickle.html
pickle协议格式如下:
协议版本0是原始的“人类可读”协议,并向后兼容Python的早期版本。
协议版本1是一种旧的二进制格式,它也与早期版本的Python兼容。
协议版本2是在Python 2.3中引入的。它提供了更有效的新样式类的pickle。有关协议2带来的改进,请参阅PEP 307。
协议版本3是在Python 3.0中添加的。它显式支持bytes对象,不能被Python 2.x解封。这是默认协议,也是在需要与其他Python 3版本兼容时的推荐协议。
协议版本4是在Python 3.4中添加的。它增加了对非常大的对象、pickle更多类型的对象以及一些数据格式优化的支持。有关协议4带来的改进的信息,请参阅PEP 3154。
Arctic是一个高性能的Pandas, numpy和其他数值数据的数据存储。它位于MongoDB之上。也许对于OP来说有点过分了,但对于其他无意中看到这篇文章的人来说,值得一提
最简单的方法是使用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对象/文本较多的数据(参见这个问题)。
泡菜很好!
import pandas as pd
df.to_pickle('123.pkl') #to save the dataframe, df to 123.pkl
df1 = pd.read_pickle('123.pkl') #to load 123.pkl back to the dataframe df
如前所述,有不同的选项和文件格式(HDF5, JSON, CSV, parquet, SQL)来存储数据帧。然而,pickle不是一级公民(取决于你的设置),因为:
泡菜是一个潜在的安全隐患。形成pickle的Python文档:
警告pickle模块不安全 恶意构造的数据。对象接收的数据永远不能解pickle 不受信任或未经身份验证的源。
泡菜很慢。找到这里和这里的基准。
根据您的设置/使用情况,这两个限制都不适用,但我不建议将pickle作为pandas数据帧的默认持久性。
推荐文章
- 数据类vs类型。NamedTuple主要用例
- 如何从macOS完全卸载蟒蛇
- 是否有可能键入提示一个lambda函数?
- 'dict'对象没有has_key属性
- 使用Pandas groupby连接来自几行的字符串
- Pandas:给定列的数据帧行之和
- 如何避免在为Python项目构建Docker映像时重新安装包?
- 如何激活蟒蛇环境
- 省略[…]意思是在一个列表里?
- 将数据帧行按向量按特定顺序排序
- 为什么我得到“'str'对象没有属性'读取'”当尝试使用' json。载入字符串?
- 不区分大小写的列表排序,没有降低结果?
- 排序后的语法(key=lambda:…)
- 在烧瓶中返回HTTP状态代码201
- 使用python创建一个简单的XML文件