una insertar filas fila data columna agregar python indexing pandas dataframe hdfstore

python - insertar - append pandas



¿Cómo se pueden agregar grandes cantidades de datos a Pandas HDFStore y obtener un índice natural único? (1)

Estoy importando grandes cantidades de registros http (80GB +) en un Pandas HDFStore para el procesamiento estadístico. Incluso dentro de un único archivo de importación, necesito agrupar el contenido a medida que lo cargo. Mi táctica hasta ahora ha sido leer las líneas analizadas en un DataFrame y luego almacenar el DataFrame en el HDFStore. Mi objetivo es tener la clave de índice única para una sola clave en la DataStore, pero cada DataFrame reinicia su propio valor de índice nuevamente. Estaba anticipando que HDFStore.append () tendría algún mecanismo para decirle que ignore los valores del índice del DataFrame y simplemente siga agregando valores de índice existentes de mi clave HDFStore, pero parece que no puede encontrarlo. ¿Cómo importo DataFrames e ignoro los valores de índice contenidos allí mientras que el HDFStore incrementa sus valores de índice existentes? El código de muestra debajo de lotes cada 10 líneas. Naturalmente, lo real sería más grande.

if hd_file_name: """ HDF5 output file specified. """ hdf_output = pd.HDFStore(hd_file_name, complib=''blosc'') print hdf_output columns = [''source'', ''ip'', ''unknown'', ''user'', ''timestamp'', ''http_verb'', ''path'', ''protocol'', ''http_result'', ''response_size'', ''referrer'', ''user_agent'', ''response_time''] source_name = str(log_file.name.rsplit(''/'')[-1]) # HDF5 Tables don''t play nice with unicode so explicit str(). :( batch = [] for count, line in enumerate(log_file,1): data = parse_line(line, rejected_output = reject_output) # Add our source file name to the beginning. data.insert(0, source_name ) batch.append(data) if not (count % 10): df = pd.DataFrame( batch, columns = columns ) hdf_output.append(KEY_NAME, df) batch = [] if (count % 10): df = pd.DataFrame( batch, columns = columns ) hdf_output.append(KEY_NAME, df)


Puedes hacerlo así El único truco es que la primera vez que la tabla de la tienda no existe, se get_storer .

import pandas as pd import numpy as np import os files = [''test1.csv'',''test2.csv''] for f in files: pd.DataFrame(np.random.randn(10,2),columns=list(''AB'')).to_csv(f) path = ''test.h5'' if os.path.exists(path): os.remove(path) with pd.get_store(path) as store: for f in files: df = pd.read_csv(f,index_col=0) try: nrows = store.get_storer(''foo'').nrows except: nrows = 0 df.index = pd.Series(df.index) + nrows store.append(''foo'',df) In [10]: pd.read_hdf(''test.h5'',''foo'') Out[10]: A B 0 0.772017 0.153381 1 0.304131 0.368573 2 0.995465 0.799655 3 -0.326959 0.923280 4 -0.808376 0.449645 5 -1.336166 0.236968 6 -0.593523 -0.359080 7 -0.098482 0.037183 8 0.315627 -1.027162 9 -1.084545 -1.922288 10 0.412407 -0.270916 11 1.835381 -0.737411 12 -0.607571 0.507790 13 0.043509 -0.294086 14 -0.465210 0.880798 15 1.181344 0.354411 16 0.501892 -0.358361 17 0.633256 0.419397 18 0.932354 -0.603932 19 -0.341135 2.453220

En realidad, no necesita necesariamente un índice único global, (a menos que desee uno) ya que HDFStore (a través de PyTables ) proporciona uno mediante la numeración única de filas. Siempre puede agregar estos parámetros de selección.

In [11]: pd.read_hdf(''test.h5'',''foo'',start=12,stop=15) Out[11]: A B 12 -0.607571 0.507790 13 0.043509 -0.294086 14 -0.465210 0.880798