2015-10-31 13 views
6

Ho un enorme file HDF5, voglio caricarne una parte in un DataFrame panda per eseguire alcune operazioni, ma sono interessato a filtrare alcune righe.legge il file HDF5 su pda DataFrame con condizioni

posso spiegare meglio con un esempio:

file di HDF5 originale sarebbe simile:

A B C D 
1 0 34 11 
2 0 32 15 
3 1 35 22 
4 1 34 15 
5 1 31 9 
1 0 34 15 
2 1 29 11 
3 0 34 15 
4 1 12 14 
5 0 34 15 
1 0 32 13 
2 1 34 15 
etc etc etc etc 

Quello che sto cercando di fare è di caricare questo, esattamente come è, ad un panda dataframe ma solo where A==1 or 3 or 4

Fino ad ora posso solo caricare l'intera HDF5 utilizzando:

store = pd.HDFStore('Resutls2015_10_21.h5') 
df = pd.DataFrame(store['results_table']) 

Non vedo come includere una condizione where qui.

risposta

6

Il file hdf5 deve essere scritto in table format (al contrario di formato fixed) in per essere interrogabile con where argomento pd.read_hdf s'.

Inoltre, A deve essere declared as a data_column:

df.to_hdf('/tmp/out.h5', 'results_table', mode='w', data_columns=['A'], 
      format='table') 

o, per specificare tutte le colonne come (Queryable) colonne di dati:

df.to_hdf('/tmp/out.h5', 'results_table', mode='w', data_columns=True, 
      format='table') 

allora si potrebbe utilizzare

pd.read_hdf('/tmp/out.h5', 'results_table', where='A in [1,3,4]') 

a selezionare le righe in cui la colonna valore A è 1, 3 o 4. Per esempio,

import numpy as np 
import pandas as pd 

df = pd.DataFrame({ 
    'A': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2], 
    'B': [0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1], 
    'C': [34, 32, 35, 34, 31, 34, 29, 34, 12, 34, 32, 34], 
    'D': [11, 15, 22, 15, 9, 15, 11, 15, 14, 15, 13, 15]}) 

df.to_hdf('/tmp/out.h5', 'results_table', mode='w', data_columns=['A'], 
      format='table') 

print(pd.read_hdf('/tmp/out.h5', 'results_table', where='A in [1,3,4]')) 

cede

A B C D 
0 1 0 34 11 
2 3 1 35 22 
3 4 1 34 15 
5 1 0 34 15 
7 3 0 34 15 
8 4 1 12 14 
10 1 0 32 13 

Se si dispone di un lungo elenco di valori, vals, allora si potrebbe utilizzare la formattazione delle stringhe per comporre l'argomento giusto where:

where='A in {}'.format(vals) 
+0

Grazie unutbu, solo alcuni commenti su questa buona risposta. Capisco che all'inizio della tua risposta scrivi il df in h5 in formato tabella. Tuttavia, l'input per il mio script è un h5 già salvato, come posso sapere se è nel formato corretto o no? – codeKiller

+0

Se il tuo file 'h5' non è nel formato' table', allora usando 'pd.read_hdf' con il parametro' where' genererà 'TypeError: non può passare una specifica where quando legge da un formato Fisso ...'. Se il file 'h5' si trova nel formato' table' di 'A' non è stato specificato come' data_column', allora si otterrebbe 'ValueError: L'espressione dove passato: A in [1,3,4] contiene una variabile non valida di riferimento ... '. – unutbu

+0

Non conosco un modo facile e veloce per convertire un file h5 da 'fixed' a' table' format, o per aggiungere 'data_columns'. Per quanto ne so, dovresti leggere l'intero file 'h5' in un DataFrame (o farlo in blocchi usando il parametro' chunksize') e poi scriverlo o aggiungerlo a un diverso file 'h5' in formato 'table'. – unutbu

1

È possibile farlo utilizzando pandas.read_hdf (here), con il parametro facoltativo di where.
Per example: read_hdf('store_tl.h5', 'table', where = ['index>2'])

+0

Grazie Dean, è possibile includere condizioni più complesse? come ad esempio, se la mia colonna A ha valori da 1 a 100 e voglio selezionare qualcosa di casuale come [1,3,11,16,27,33,34,44,41,55,68,70,77,81 , 90] ... lo chiedo perché nella domanda principale volevo semplificare, ma nel mio caso reale la condizione 'where' avrebbe dovuto essere più complessa – codeKiller

+0

Trovato la documentazione per l'Expr che devi passare a dove: http://nullege.com/codes/search/pandas.computation.pytables.Expr?fulldoc=1 (Potrebbe essere utile, anche se non vedo un'opzione per il filtraggio per contenimento) –

+0

ok, grazie mille – codeKiller

Problemi correlati