Mam duży zestaw danych, który nie pasuje do pamięci. Obecnie przechowuję to w HDFStore z 2 tabelami: df_hist to zbiór histogramów indeksowanych przez MultiIndex, gdzie pierwszego poziomu etykietuje histogram, a drugi poziom ma najemnik histogramu. df_params Zawiera parametry symulacyjne używane do generowania każdego histogramu i jest indeksowane przez etykiety histogramowe (tj. Pierwszy poziom indeksu {x3}}).

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

Co chciałbym zrobić, jest wybrać podzbiór histogramów, aby załadować za pomocą niektórych zapytania na tabeli df_params, a następnie załaduj tylko odpowiednie wiersze z df_hist. Jeśli dane były w stanie pasować do pamięci, zrobiłbym coś w rodzaju:

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

Jakie jest najlepsze podejście do osiągnięcia tego, gdy df_hist jest zbyt duży, aby pasować do pamięci? Idealnie możliwe byłoby coś zrobić

store.select('df_hist', where='id isin selection')
2
mcwitt 21 listopad 2013, 06:53

2 odpowiedzi

Najlepsza odpowiedź
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

Działa to w 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

Działa to również w 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
4
Jeff 21 listopad 2013, 14:26

W dniu 0,19 jestem w stanie użyć techniki pożądanego 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.

Opublikowałby jako komentarz, ale nie mógł z powodu rep.

2
Geraint Ballinger 30 sierpień 2017, 14:43