如何使用Pandas存储数据框
现在我每次运行脚本时都会导入一个相当大的CSV
作为数据框。 有没有一个很好的解决scheme,保持该dataframe在运行之间始终可用,所以我不必花费所有的时间等待脚本运行?
最简单的方法是使用to_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
)。
另一个stream行的select是使用HDF5 ( pytables ),它为大数据集提供了非常快的访问时间:
store = HDFStore('store.h5') store['df'] = df # save it store['df'] # load it
食谱中讨论了更高级的策略。
自0.13以来,也有msgpack可能会更好的互操作性,作为JSON的更快的替代,或者如果你有python对象/文本大量的数据(见这个问题 )。
虽然已经有一些答案,我发现了一个很好的比较,他们尝试了几种方法来序列化Pandas DataFrames: 高效地存储Pandas DataFrames 。
他们比较:
- pickle:原始的ASCII数据格式
- cPickle,一个C库
- pickle-p2:使用较新的二进制格式
- json:standardlib json库
- json-no-index:和json一样,但没有索引
- msgpack:二进制JSON替代
- CSV
- hdfstore:HDF5存储格式
在他们的实验中,他们序列化了一个1000000行的DataFrame,两列分开testing:一个是文本数据,另一个是数字。 他们的免责声明说:
你不应该相信后面的内容会对你的数据进行概括。 您应该查看自己的数据并自行运行基准testing
他们提到的testing的源代码可以在线获得 。 由于这段代码没有直接工作,我做了一些小的改动,你可以在这里得到: serialize.py我得到了以下结果:
他们还提到,通过将文本数据转换为分类数据,序列化速度更快。 在他们的testing约10倍的速度(也见testing代码)。
编辑 :pickle比csv更高的时间可以通过使用的数据格式来解释。 默认情况下, pickle
使用一个可打印的ASCII表示,它会生成更大的数据集。 从图中可以看出,使用较新的二进制数据格式(版本2, pickle-p2
)的pickle-p2
具有更低的加载时间。
其他一些参考:
- 在最快的Python库来读取一个CSV文件的问题有一个非常详细的答案 ,比较不同的库阅读CSV文件与基准。 结果是读取csv文件
numpy.fromfile
是最快的。 - 另一个序列化testing显示msgpack-python , ujson和cPickle是序列化中最快的。
如果我理解正确,你已经使用pandas.read_csv()
但是想加快开发过程,这样你不必在每次编辑脚本时加载文件,是吗? 我有几个build议:
-
您可以使用
pandas.read_csv(..., nrows=1000)
仅加载CSV文件的一部分,以便只在您进行开发时加载表格的最高位 -
使用ipython进行交互式会话,以便在编辑和重新加载脚本时将pandas表保存在内存中。
-
将csv转换为HDF5表
-
更新的使用
DataFrame.to_feather()
和pd.read_feather()
来存储数据的R兼容feather二进制格式是超快速的(在我的手中,比数字数据上的pandas.to_pickle()
稍快,string数据快得多)。
您可能也有兴趣在这个答案在stackoverflow。
泡菜很好吃!
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
pandasDataFrames有to_pickle
function,这对保存DataFrame很有用:
import pandas as pd a = pd.DataFrame({'A':[0,1,0,1,0],'B':[True, True, False, False, False]}) print a # AB # 0 0 True # 1 1 True # 2 0 False # 3 1 False # 4 0 False a.to_pickle('my_file.pkl') b = pd.read_pickle('my_file.pkl') print b # AB # 0 0 True # 1 1 True # 2 0 False # 3 1 False # 4 0 False
数字数据的Numpy文件格式非常快
我更喜欢使用numpy文件,因为它们快速且易于使用。 这里有一个简单的基准,用于保存和加载1列100万分的dataframe。
import numpy as np import pandas as pd num_dict = {'voltage': np.random.rand(1000000)} num_df = pd.DataFrame(num_dict)
使用ipython的%%timeit
魔术function
%%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
将数据加载回dataframe
%%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
不错!
缺点
如果您使用python 2保存numpy文件,然后尝试使用python 3打开(反之亦然),则会出现问题。
您可以使用羽化格式文件。 这是非常快的。
df.to_feather('filename.ft')