pandas.HDFStore:如何修改现有商店的“data_columns”?我想为不在数据列中的列添加索引

Posted

技术标签:

【中文标题】pandas.HDFStore:如何修改现有商店的“data_columns”?我想为不在数据列中的列添加索引【英文标题】:pandas.HDFStore: How do I modify "data_columns" for an existing store? I'd like to add an index to a column not in data columns 【发布时间】:2016-12-06 23:27:19 【问题描述】:

我使用 pandas 创建了一个大型(120GB;10 亿行)HDF5 文件。在最初创建 hdf 文件后,我像这样添加到文件中:

with pd.get_store(path_output) as hdf_output:
  for i in range(BIG_LOOP):
    df = ...
    hdf_output.append('all', df, data_columns=[])

我故意设置 data_columns=[] 以避免在创建期间建立索引。现在我有了 HDF 文件,我想为几列添加索引(例如,columns_to_index=['A', 'B', 'C'])

不知何故,根据 ptdump,我现在确实有 data_columns:=['A'],但我不记得这是怎么发生的。 (也许最初的 df 是用不同的参数编写的(我连续几天添加到 hdfstore 并且我可能已经改变了一些东西)。无论如何,无论如何,不​​管它是如何创建的,我想索引额外的列。

显然,仅仅调用mystore.create_table_index('all', columns=['A', 'B', 'C'], optlevel=9, kind='full') 是行不通的。我第一次运行它时,它搅动了一个小时,并为文件大小增加了 2 GB(检查元数据显示块大小增加了),但我没有所有 3 个索引(只是“A”的索引)。 如何为所有 3 列生成索引?

我还注意到 ptdump 中的这一行——我想索引的项目有“non_index_axes”似乎令人不安:non_index_axes := [(1, ['A', 'B', 'C'])]

如果无法在 pandas 中创建索引,我将不胜感激有关如何直接在 pytables 中执行此操作的建议。 (例如,我是否需要先删除任何现有索引?以及如何修改“non_index_axes”和“data_coumns”)

编辑:预测有关我的用例的问题,这是我要完成的工作的总体情况:

    从 CSV 文件中读取 120 GB 的数据。每个文件代表一天的财务数据,由 100,000 行组成,每行大约有十几列。我只是将每一行按顺序存储在 HDF5 文件中。我希望这个初始阶段能够快速运行,因此我关闭了索引。目前我在 6 秒内读取和解析每个 CSV 文件,如上存储到 HDF5 文件中只需 1.5 秒。

    索引少数(不是全部)列以支持各种查询,例如获取第 1 列中具有给定字符串和第 2 列中特定范围内的日期的所有项目。

    随着时间的推移,我每天都会解析一个新的 CSV 文件并将其添加到 HDF5 文件中。我预计指数会继续更新。

    (根据我的访问模式,我存储行的顺序(当前,按日期)可能仍然是检索的最佳顺序。在大多数查询中,我最终可能还需要按不同的列排序,在这种情况下,我认为我需要在每个 CSV 文件被解析和附加后重新排序。)

目前我被困在第 2 步,生成列索引。

【问题讨论】:

【参考方案1】:

我会有所不同 - take a look at this small example:

for chunk in ...  # reading data in chunks:
    # specify `data_columns`, but don't index (`index=False`)
    hdf_output.append('all', chunk, data_columns=[cols_to_index], index=False)

# index columns explicitly     
hdf_output.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full')

【讨论】:

谢谢——是的,我在生成文件后发现了这个 index=False 语法,所以很高兴知道。但是,理想情况下,我似乎应该可以修复现有文件——“data_columns”并没有固定在 HDF 文件中……是吗?

以上是关于pandas.HDFStore:如何修改现有商店的“data_columns”?我想为不在数据列中的列添加索引的主要内容,如果未能解决你的问题,请参考以下文章

Pandas HDFStore:省略重复项

Pandas HDFStore 从内存中卸载数据帧

使用 Pandas HDFStore 以只读模式打开文件

Python Pandas hdfstore 的 select(where='') 返回不合格的结果

Pandas HDFStore:当 min_itemsize 设置为字符串列的最大值时追加失败

如何在 Python 中查找 HDF5 文件组/键?