2013-11-21 62 views
3

我有一个不适合内存的大型数据集。我正在将它存储在HDFStore中,并且有两个表格:df_hist是一个由MultiIndex索引的直方图集合,其中第一个级别标记直方图,第二个级别标记直方图bin。 df_params包含用于生成每个直方图的模拟参数,并且由直方图标签(即df_hist索引的第一级)索引。从给定的索引列表中选择HDFStore中的行

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') 
+1

你有什么试过?你看过[HDF5文档](http://pandas.pydata.org/pandas-docs/dev/io.html#querying-a-table)吗?从这里的例子:'store.select('dfq','index'Timestamp('20130104')&columns = ['A','B']“)'听起来很像你想要的。你可能不得不写一个包装来做选择,因为我不确定'isin'是否被支持。同样它需要在'表'格式,而不是'固定' – TomAugspurger

回答

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 

这个工作在主/ 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 
+0

传递查询“lhs = list_of_values”相当于isin' – Jeff

+0

谢谢,这正是我需要的。 – mcwitt

1

在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. 

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

相关问题