从HDFStore给定的索引列表中选择行

时间:2013-11-21 02:53:02

标签: python pandas

我有一个不适合内存的大型数据集。我目前将其存储在具有2个表的HDFStore中:df_hist是由MultiIndex索引的直方图集合,其中第一级标记直方图,第二级标记直方图区。 df_params包含用于生成每个直方图的模拟参数,并由直方图标签(即df_hist索引的第一级)索引。

In [1]: store = pandas.HDFStore('test.h5')

In [2]: store['df_params'].head()
Out[2]: 
    N  z  sample  sigma  oct       T
0  64  6    6235    0.6   22  0.8200
1  64  6    6235    0.6   22  0.8476
2  64  6    6235    0.6   22  0.8757
3  64  6    6235    0.6   22  0.9043
4  64  6    6235    0.6   22  0.9336

In [3]: store['df_hist'].head()
Out[3]: 
               p     p_err
id bin                    
0  0    0.000382  0.000008
   1    0.002010  0.000025
   2    0.005244  0.000038
   3    0.009347  0.000052
   4    0.012662  0.000058

我想要做的是选择直方图的一个子集,使用df_params表上的某个查询加载,然后只加载df_hist中的相关行。如果数据能够适合内存,我会做类似的事情:

df_params = store['df_params']
df_hist = store['df_hist']
selection = df_params.index[df_params['N']==64]
df = df_hist[df_hist.index.get_level_values('id').isin(selection)]

df_hist太大而无法记忆时,实现此目的的最佳方法是什么?理想情况下,可以执行类似

的操作
store.select('df_hist', where='id isin selection')

2 个答案:

答案 0 :(得分:3)

In [5]: parms = DataFrame({ 'A' : [1,1,2,2,3] })

In [6]: parms
Out[6]: 
   A
0  1
1  1
2  2
3  2
4  3

In [7]: parms.to_hdf('parms.hdf','df',mode='w',format='table',data_columns=['A'])

In [8]: selection = pd.read_hdf('parms.hdf','df',where='A=[2,3]')

In [9]: selection
Out[9]: 
   A
2  2
3  2
4  3

In [10]: hist = DataFrame(np.random.randn(25,1),columns=['data'],
   ....: index=MultiIndex.from_tuples([ (i,j) for i in range(5) for j in range(5) ],
   ....: names=['l1','l2']))

In [11]: hist
Out[11]: 
           data
l1 l2          
0  0   1.232358
   1  -2.677047
   2  -0.168854
   3   0.538848
   4  -0.678224
1  0   0.092575
   1   1.297578
   2  -1.489906
   3  -1.380054
   4   0.701762
2  0   1.397368
   1   0.198522
   2   1.034036
   3   0.650406
   4   1.823683
3  0   0.045635
   1  -0.213975
   2  -1.221950
   3  -0.145615
   4  -1.187883
4  0  -0.782221
   1  -0.626280
   2  -0.331885
   3  -0.975978
   4   2.006322

这适用于0.12

In [15]: pd.read_hdf('hist.hdf','df',where=pd.Term('l1','=',selection.index.tolist()))
Out[15]: 
           data
l1 l2          
2  0   1.397368
   1   0.198522
   2   1.034036
   3   0.650406
   4   1.823683
3  0   0.045635
   1  -0.213975
   2  -1.221950
   3  -0.145615
   4  -1.187883
4  0  -0.782221
   1  -0.626280
   2  -0.331885
   3  -0.975978
   4   2.006322

这也适用于master / 0.13

In [16]: pd.read_hdf('hist.hdf','df',where='l1=selection.index')
Out[16]: 
           data
l1 l2          
2  0   1.397368
   1   0.198522
   2   1.034036
   3   0.650406
   4   1.823683
3  0   0.045635
   1  -0.213975
   2  -1.221950
   3  -0.145615
   4  -1.187883
4  0  -0.782221
   1  -0.626280
   2  -0.331885
   3  -0.975978
   4   2.006322

答案 1 :(得分:2)

在0.19我能够使用OP所需的技术:

indices = [3,5]
for df in store.select('df', where="index in indices", chunksize=100000):
    print df # prints rows with index 3 or 5.

会发布评论,但由于代表无法发布。