如何使用Pandas存储数据框

现在我每次运行脚本时都会导入一个相当大的CSV作为数据框。 有没有一个很好的解决scheme,保持该dataframe在运行之间始终可用,所以我不必花费所有的时间等待脚本运行?

最简单的方法是使用to_pickleto_pickle它:

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

然后你可以使用下面的代码加载它:

 df = pd.read_pickle(file_name) 

注意:在0.11.1 saveload之前,这是唯一的方法(它们现在被弃用,分别支持to_pickleread_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议:

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

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

  3. 将csv转换为HDF5表

  4. 更新的使用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_picklefunction,这对保存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')