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

时间:2016-08-01 19:08:56

标签: python pandas hdf5 pytables hdfstore

我使用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(检查元数据显示chunksize增加了),但我没有所有3个索引(只是'A'的索引)。 如何为所有3列生成索引?

我也注意到ptdump中的这一行 - 对于我想要编制索引的项目,我有“non_index_axes”似乎很令人不安:non_index_axes := [(1, ['A', 'B', 'C'])]

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

编辑:预测有关我的用例的问题,以下是我要完成的工作的全貌:

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

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

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

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

  5. 目前我停留在第2步,生成列索引。

1 个答案:

答案 0 :(得分:2)

我做得与众不同 - 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')