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