2014-01-10 9 views
6

Ist es möglich, eine zufällige Teilmenge von Zeilen von HDF5 (über pyTables oder, vorzugsweise Pandas) zu lesen? Ich habe einen sehr großen Datensatz mit Millionen von Zeilen, brauche aber nur ein paar Tausend für die Analyse. Und was ist mit dem Lesen von komprimierten HDF-Dateien?PyTables gelesen zufällige Teilmenge

Antwort

8

Mit HDFStore docs sind here, Kompression docs sind here

Zufallszugriff über einen konstruierten Index in 0.13 unterstützt wird

In [26]: df = DataFrame(np.random.randn(100,2),columns=['A','B']) 

In [27]: df.to_hdf('test.h5','df',mode='w',format='table') 

In [28]: store = pd.HDFStore('test.h5') 

In [29]: nrows = store.get_storer('df').nrows 

In [30]: nrows 
Out[30]: 100 

In [32]: r = np.random.randint(0,nrows,size=10) 

In [33]: r 
Out[33]: array([69, 28, 8, 2, 14, 51, 92, 25, 82, 64]) 

In [34]: pd.read_hdf('test.h5','df',where=pd.Index(r)) 
Out[34]: 
      A   B 
69 -0.370739 -0.325433 
28 0.155775 0.961421 
8 0.101041 -0.047499 
2 0.204417 0.470805 
14 0.599348 1.174012 
51 0.634044 -0.769770 
92 0.240077 -0.154110 
25 0.367211 -1.027087 
82 -0.698825 -0.084713 
64 -1.029897 -0.796999 

[10 rows x 2 columns] 

Um eine weitere Bedingung enthalten, die Sie wie folgt tun würde:

# make sure that we have indexable columns 
df.to_hdf('test.h5','df',mode='w',format='table',data_columns=True) 

# select where the index (an integer index) matches r and A > 0 
In [14]: r 
Out[14]: array([33, 51, 33, 95, 69, 21, 43, 58, 58, 58]) 

In [13]: pd.read_hdf('test.h5','df',where='index=r & A>0') 
Out[13]: 
      A   B 
21 1.456244 0.173443 
43 0.174464 -0.444029 

[2 rows x 2 columns] 
+0

Ist es möglich, andere 'where' Bedingungen in' read_hdf' einzubeziehen? Zum Beispiel, wenn ich 10 positive Zahlen abtasten möchte? – Marigold

+0

aktualisiert ... siehe oben – Jeff

+0

Danke, aber das ist nicht wirklich das, was ich meinte. Ich brauche 10 positive Zahlen, aber Ihr Beispiel gibt nur 2 zurück (Sie erhalten positive Zahlen aus einer Stichprobe von 10). Ich benutzte Generator und Sampling von Chunks. – Marigold