pythonpandas数据怎么用_python - 如何使用Pandas存储数据帧

本文介绍了多种在Python中使用Pandas库存储和加载DataFrame的方法,包括pickle、HDF5、msgpack、feather和CSV等格式。讨论了各种方法的速度和适用场景,并提供了代码示例。例如,`df.to_pickle()` 和 `pd.read_pickle()` 用于pickle格式,`df.to_feather()` 和 `pd.read_feather()` 则提供了快速的R兼容存储方案。
摘要由CSDN通过智能技术生成

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  我得到了以下结果:

T9JEL.png

他们还提到,通过将文本数据转换为分类数据,序列化速度更快。 在他们的测试中大约快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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值