python - 如何使用Pandas存储数据帧
现在我每次运行脚本时都会导入一个相当大的CSV数据帧。 是否有一个很好的解决方案可以保持数据帧在运行之间始终可用,因此我不必花费所有时间等待脚本运行?
8个解决方案
303 votes
最简单的方法是使用save来腌制它:
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),它为大型数据集提供非常快的访问时间:
store = HDFStore('store.h5')
store['df'] = df # save it
store['df'] # load it
烹饪书中讨论了更高级的策略。
从0.13开始,msgpack也可以更好地实现互操作性,作为JSON的更快替代方案,或者如果你有python对象/文本重量数据(参见这个问题)。
Andy Hayden answered 2019-03-11T20:35:26Z
60 votes
虽然已经有一些答案,但我发现了一个很好的比较,他们尝试了几种方法来序列化Pandas DataFrames:Efficiently Store Pandas DataFrames。
他们比较:
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倍(也见测试代码)。
编辑:泡菜比csv更高的时间可以用所用的数据格式来解释。 默认情况下,numpy.fromfile使用可打印的ASCII表示形式,该表示形式生成更大的数据集。 然而,从图中可以看出,使用较新的二进制数据格式(版本2,numpy.fromfile)的pickle具有低得多的加载时间。
其他一些参考:
在最快的Python库中,为了读取CSV文件,有一个非常详细的答案,它将不同的库与基准读取csv文件进行比较。 结果是,对于读取csv文件,numpy.fromfile是最快的。
另一个序列化测试显示msgpack-python,ujson和cPickle是序列化中最快的。
agold answered 2019-03-11T20:37:41Z
28 votes
如果我理解正确,你已经在使用DataFrame.to_feather(),但是想加快开发过程,这样你就不必在每次编辑脚本时加载文件,是吗? 我有一些建议:
您可以使用DataFrame.to_feather()仅加载部分CSV文件,只加载表格的顶部位,同时进行开发
使用ipython进行交互式会话,以便在编辑和重新加载脚本时将pandas表保留在内存中。
将csv转换为HDF5表
更新使用DataFrame.to_feather()和pd.read_feather()以超快速的R兼容羽毛二进制格式存储数据(在我手中,比数字数据上的pandas.to_pickle()略快,对字符串数据更快)。
您可能也对stackoverflow上的这个答案感兴趣。
Noah answered 2019-03-11T20:38:49Z
13 votes
泡菜很好用!
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
Anbarasu Ramachandran answered 2019-03-11T20:39:14Z
4 votes
Pandas DataFrames具有to_pickle功能,可用于保存DataFrame:
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
mgoldwasser answered 2019-03-11T20:39:40Z
4 votes
您可以使用羽毛格式文件。 它非常快。
df.to_feather('filename.ft')
Huanyu Liao answered 2019-03-11T20:40:06Z
2 votes
Numpy文件格式对于数字数据来说非常快
我更喜欢使用numpy文件,因为它们快速且易于使用。这是一个简单的基准,用于保存和加载1列100万点的数据帧。
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
不错!
缺点
如果使用python 2保存numpy文件然后尝试使用python 3打开(反之亦然),则会出现问题。
mark jay answered 2019-03-11T20:41:13Z
0 votes
import pickle
example_dict = {1:"6",2:"2",3:"g"}
pickle_out = open("dict.pickle","wb")
pickle.dump(example_dict, pickle_out)
pickle_out.close()
上面的代码将保存pickle文件
pickle_in = open("dict.pickle","rb")
example_dict = pickle.load(pickle_in)
这两行将打开保存的pickle文件
Anirban Manna answered 2019-03-11T20:41:45Z