目前我每次运行脚本时都需要将一个相当大的CSV
导入为数据帧。有没有一种好的解决方案,可以在运行之间保持该数据帧的可用性,以便我不必花费所有时间等待脚本运行?
最简单的方法是使用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
代替)。
另一个流行的选择是使用HDF5(pytables),它为大型数据集提供了非常快速的访问时间:very fast。
import pandas as pd
store = pd.HDFStore('store.h5')
store['df'] = df # save it
store['df'] # load it
更高级的策略在食谱中讨论。
自从0.13版本起,还有msgpack,它可能更适用于互操作性,作为JSON的更快速的替代品,或者如果您有python对象/文本重的数据(请参见此问题)。
HDFStore
方法已更名为 to_hdf
。 - yoursbh他们所提及的测试源代码可在线上获得。由于该代码并不能直接工作,我做了一些小的改动,你可以在serialize.py中获得。我得到了以下结果:你不应该相信下面的内容适用于你的数据。你应该查看自己的数据并自己运行基准测试。
编辑:相对于CSV,pickle的加载时间更高可以通过所使用的数据格式来解释。默认情况下,pickle
使用可打印的ASCII表示形式,这会生成更大的数据集。然而,从图中可以看出,使用新的二进制数据格式(版本2,pickle-p2
)的pickle具有更低的加载时间。
一些其他参考:
numpy.fromfile
读取CSV文件是最快的。.to_pickle()
(使用二进制存储)和.to_hdf()
(无压缩)进行了比较。目标是速度,HDF的文件大小是Pickle的11倍,加载时间是Pickle的5倍。我的数据大约有5k个文件,每个文件大约有7k行x 6列,主要是数字。 - hamx0rpandas.read_csv()
,但希望加快开发过程,以便在每次编辑脚本时不必重新加载文件,是这样吗?我有一些建议:
您可以使用 pandas.read_csv(..., nrows=1000)
仅加载表的前面部分,在开发过程中使用。
使用 ipython 进行交互式会话,使得您在编辑和重新加载脚本时保留 pandas 表在内存中。
将 CSV 转换为 HDF5 表格。
更新:使用 DataFrame.to_feather()
和 pd.read_feather()
将数据存储在 R 兼容的 feather 二进制格式中,该格式超级快速(在我的手中,数值数据略快于 pandas.to_pickle()
,而字符串数据则快得多)。
您还可能对 stackoverflow 上的这个答案 感兴趣。
to_feather
在字符串数据上表现良好吗?我在我的数值数据框架上对 to_pickle
和 to_feature
进行了基准测试,结果 pickle 大约快了3倍。 - zyxuePickle工作得很好!
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
.pkl
。 - agold你可以使用Feather格式文件,它非常快。
df.to_feather('filename.ft')
feather
库直接在R
中使用。 - James Hirschornto_pickle
的函数,可用于保存数据框:import pandas as pd
a = pd.DataFrame({'A':[0,1,0,1,0],'B':[True, True, False, False, False]})
print a
# A B
# 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
# A B
# 0 0 True
# 1 1 True
# 2 0 False
# 3 1 False
# 4 0 False
另一个使用to_pickle()
的新测试。
我一共有25个.csv
文件需要处理,最终的dataframe
大约包含2M条数据。
(注意:除了加载.csv文件外,我还会操作一些数据并通过新列扩展数据框。)
遍历所有25个.csv
文件并创建数据框需要大约14秒
。
从pkl
文件中加载整个数据框只需要不到1秒
。
我更喜欢使用numpy文件,因为它们快速且易于操作。 这里是一个简单的基准测试,用于保存和加载具有100万个点的1列数据框。
import numpy as np
import pandas as pd
num_dict = {'voltage': np.random.rand(1000000)}
num_df = pd.DataFrame(num_dict)
%%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
不错!
如果你使用Python 2保存numpy文件,然后尝试在Python 3中打开(或反之亦然),就会出现问题。
https://docs.python.org/3/library/pickle.html
腌制协议格式:
协议版本0是原始的“人类可读”协议,与早期版本的Python向后兼容。
协议版本1是一种旧的二进制格式,也与早期版本的Python兼容。
协议版本2在Python 2.3中引入。它提供了新式类的更高效的腌制。请参阅PEP 307以获取有关协议2带来的改进的信息。
协议版本3在Python 3.0中添加。它明确支持字节对象,并且无法由Python 2.x取消腌制。这是默认协议,并且在需要与其他Python 3版本兼容性时推荐使用。
协议版本4在Python 3.4中添加。它增加了对非常大的对象的支持,腌制更多种类的对象和一些数据格式优化。请参阅PEP 3154以获取有关协议4带来的改进的信息。