我有一个不适合内存的大型数据集。我目前将其存储在具有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')
答案 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.
会发布评论,但由于代表无法发布。