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

标签 python pandas numpy stata hdf5

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

这对我来说很有值(value),因为它允许我保存各种信息,从提醒和待办事项列表到有关我如何生成数据的信息,甚至是特定变量的估计方法曾是。

我现在正在尝试在 Python 3.6 中提供类似的功能。到目前为止,我已经在网上查看并查阅了许多帖子,但是这些帖子并没有完全解决我想要做的事情。

一些引用帖子包括:

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

例如:

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)

压缩和分 block

有很多压缩选择,例如blosclzf 分别是压缩和解压缩性能的不错选择。注意 gzip 是原生的;默认情况下,您的 HDF5 安装可能不附带其他压缩过滤器。

分 block 是另一种选择,当它与您从内存中读取数据的方式保持一致时,可以显着提高性能。

添加一些属性

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']

没有什么可以替代阅读 h5py documentation ,它公开了大部分 C API,但您应该从上面看到有很大的灵 active 。

关于python - 将数组或 DataFrame 与其他信息一起保存在文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49740190/

相关文章:

python - Pandas 的 read_csv 总是在小文件上崩溃

python - 机器学习: best technique to deal with a lot of categorical data

python - 如何使用 C 库刷新 Python 程序中的内存?

python - 如何将具有值的二级类别列转换为多列

python - Numpy 二维数组按行减法

python - 为什么PyCharm不导入/检测从源代码编译和安装的OpenCV?

python - 如何以简单的方式删除 pandas 数据框中的特殊行

python - 使用 pandas 将单行转换为 NaN 的稀疏矩阵

python - 如何避免使用opencv和numpy逐像素循环遍历图像

python-3.x - 如何使包含 numpy 数组的元组可散列?