Cómo consultar una tienda HDF usando Pandas / Python

Para administrar la cantidad de RAM que consume al hacer un análisis, tengo un gran conjunto de datos almacenado en hdf5 (.h5) y necesito consultar este conjunto de datos de manera eficiente utilizando Pandas.

El conjunto de datos contiene datos de rendimiento del usuario para un conjunto de aplicaciones. Solo quiero sacar algunos campos de los 40 posibles, y luego filtrar el dataframe resultante solo para aquellos usuarios que están usando una de las pocas aplicaciones que me interesan.

# list of apps I want to analyze apps = ['a','d','f'] # Users.h5 contains only one field_table called 'df' store = pd.HDFStore('Users.h5') # the following query works fine df = store.select('df',columns=['account','metric1','metric2'],where=['Month==10','IsMessager==1']) # the following pseudo-query fails df = store.select('df',columns=['account','metric1','metric2'],where=['Month==10','IsMessager==1', 'app in apps']) 

Me doy cuenta de que la cadena ‘aplicación en aplicaciones’ no es lo que quiero. Esto es simplemente una representación similar a SQL de lo que espero lograr. Parece que no puedo pasar una lista de cadenas de ninguna manera que bash, pero debe haber una manera.

Por ahora, simplemente estoy ejecutando la consulta sin este parámetro y, a continuación, filtro las aplicaciones que no quiero en un paso posterior.

 df = df[df['app'].isin(apps)] 

Pero esto es mucho menos eficiente, ya que TODAS las aplicaciones deben cargarse primero en la memoria antes de que pueda eliminarlas. En algunos casos, este es un gran problema porque no tengo suficiente memoria para soportar todo el df sin filtrar.

Estás bastante cerca.

 In [1]: df = DataFrame({'A' : ['foo','foo','bar','bar','baz'], 'B' : [1,2,1,2,1], 'C' : np.random.randn(5) }) In [2]: df Out[2]: ABC 0 foo 1 -0.909708 1 foo 2 1.321838 2 bar 1 0.368994 3 bar 2 -0.058657 4 baz 1 -1.159151 [5 rows x 3 columns] 

Escriba la tienda como una tabla (tenga en cuenta que en 0.12 usará table=True , en lugar de format='table' ). Recuerde especificar los data_columns que desea consultar al crear la tabla (o puede hacer data_columns=True )

 In [3]: df.to_hdf('test.h5','df',mode='w',format='table',data_columns=['A','B']) In [4]: pd.read_hdf('test.h5','df') Out[4]: ABC 0 foo 1 -0.909708 1 foo 2 1.321838 2 bar 1 0.368994 3 bar 2 -0.058657 4 baz 1 -1.159151 [5 rows x 3 columns] 

La syntax en master / 0.13, isin se logra a través de query_column=list_of_values . Esto se presenta como una cadena a donde.

 In [8]: pd.read_hdf('test.h5','df',where='A=["foo","bar"] & B=1') Out[8]: ABC 0 foo 1 -0.909708 2 bar 1 0.368994 [2 rows x 3 columns] 

Sintaxis en 0.12, esta debe ser una lista (que contiene las condiciones).

 In [11]: pd.read_hdf('test.h5','df',where=[pd.Term('A','=',["foo","bar"]),'B=1']) Out[11]: ABC 0 foo 1 -0.909708 2 bar 1 0.368994 [2 rows x 3 columns]