python – 将数组或DataFrame与其他信息一起保存在文件中

统计软件Stata允许将短文本片段保存在数据集中.这可以使用notes和/或characteristics完成.

这对我来说是一个很有价值的功能,因为它允许我保存各种信息,从提醒和待办事项列表到有关我如何生成数据的信息,甚至是特定变量的估算方法.

我现在正试图在Python 3.6中提出类似的功能.到目前为止,我已经在线查看了一些帖子,但这些帖子并没有完全解决我想做的事情.

一些参考文章包括:

> best way to preserve numpy arrays on disk
> What is the difference between save a pandas dataframe to pickle and to csv?
> What is the fastest way to upload a big csv file in notebook to work with python pandas?
> How do I view data object contents within an npz file?

对于一个小的NumPy数组,我得出结论,函数numpy.savez()和字典的组合可以在一个文件中充分存储所有相关信息.

例如:

a = np.array([[2,4],[6,8],[10,12]])
d = {"first": 1, "second": "two", "third": 3}

np.savez(whatever_name.npz, a=a, d=d)
data = np.load(whatever_name.npz)

arr = data['a']
dic = data['d'].tolist()

但问题仍然存在:

有没有更好的方法可以将其他信息包含在包含NumPy数组或(大)Pandas DataFrame的文件中?

我特别感兴趣的是,您可以通过示例了解您可能提出的任何建议的特殊利弊.依赖性越少越好.

解决方法:

有很多选择.我将只讨论HDF5,因为我有使用这种格式的经验.

优点:可移植(可在Python之外读取),本机压缩,内存不足功能,元数据支持.

缺点:依赖于单个低级C API,数据损坏作为单个文件的可能性,删除数据不会自动减小大小.

根据我的经验,为了性能和可移植性,请避免使用pyTables / HDFStore来存储数字数据.您可以使用h5py提供的直观界面.

存储一个数组

import h5py, numpy as np

arr = np.random.randint(0, 10, (1000, 1000))

f = h5py.File('file.h5', 'w', libver='latest')  # use 'latest' for performance

dset = f.create_dataset('array', shape=(1000, 1000), data=arr, chunks=(100, 100)
                        compression='gzip', compression_opts=9)

压缩&分块

有许多压缩选择,例如blosc和lzf分别是压缩和解压缩性能的不错选择.注意gzip是原生的;默认情况下,您的HDF5安装可能无法提供其他压缩过滤器.

分块是另一种选择,当与读取数据内存时的方式一致时,可以显着提高性能.

添加一些属性

dset.attrs['Description'] = 'Some text snippet'
dset.attrs['RowIndexArray'] = np.arange(1000)

存储字典

for k, v in d.items():
    f.create_dataset('dictgroup/'+str(k), data=v)

内存不足

dictionary = f['dictgroup']
res = dictionary['my_key']

没有什么可以替代读取暴露大部分C API的h5py documentation,但是你应该从上面看到它具有很大的灵活性.

上一篇:[ROS]一些传感器数据读取融合问题的思考


下一篇:python – pandas和Stata 13个文件