2016-08-01 48 views
2

我已经使用熊猫创建了一个大的(120GB; 10亿行)HDF5文件。初始创建HDF文件后,我添加到文件像这样:pandas.HDFStore:如何修改现有商店的“data_columns”?我想添加索引到不在数据列中的列

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

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

编辑:考虑一下我的使用情况下的问题,这里的大图片是我试图完成:

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

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

  3. 随着时间的流逝,每一天我都会解析一个新的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') 
+0

谢谢 - 是的,我发现这个指数=假语法后,我已经生成的文件,所以这是伟大的知道。不过,理想情况下,我应该可以修复现有的文件 - “data_columns”不是在HDF文件中设置的......是吗? – eraoul

相关问题