Miré la documentación de los pandas y hay varias opciones para importar datos en un marco de datos de pandas. La forma común parece ser importar un archivo csv, cuando se trata de importar archivos de texto.

Los datos que me gustaría usar son archivos de registro con el siguiente formato:

timestamp=2018-09-08T11:11:58.362028|head1=value|head2=value|head3=value
timestamp=2018-09-08T11:15:25.860244|head1=value|head2=value|head3=value

Solo necesito algunos de estos elementos importados en el marco temporal de datos, digamos marca de tiempo, head1 y head3.

En una notación csv, el marco de datos se vería así:

timestamp;head1;head3
logfile row1 - value of timestamp; value of head1; value of head3
logfile row2 - value of timestamp; value of head1; value of head3
logfile row3 - value of timestamp; value of head1; value of head3

Podría escribir un archivo csv usando estos datos, para importarlo después. ¿Pero hay una función de pandas o una forma directa de importar estos datos en un marco de datos de pandas?

Gracias por su ayuda de antemano!

1
lutz 9 sep. 2018 a las 08:31

3 respuestas

La mejor respuesta

Analizaría y procesaría el archivo así:

with open('file.csv', 'r') as fh:
  df = pd.DataFrame([dict(x.split('=') for x in l.strip().split('|')) for l in fh])
  df = df[['timestamp', 'head1', 'head3']]

df

                    timestamp  head1  head3
0  2018-09-08T11:11:58.362028  value  value
1  2018-09-08T11:15:25.860244  value  value
1
piRSquared 9 sep. 2018 a las 06:32

¡Gracias por las excelentes soluciones! Utilicé la solución proporcionada pero ya filtré las filas necesarias durante la importación, para que otros elementos estructurados diferentes en el archivo de registro no molesten:

import pandas as pd
with open('logfile.txt', 'r') as fh:
  df = pd.DataFrame([dict(x.split('=') for x in l.strip().split('|') if x.find("timestamp") > -1 or x.find("head1") > -1 or x.find("head3") > -1) for l in fh])
0
lutz 9 sep. 2018 a las 10:53

Usted puede hacer:

 columns = ['timestamp','head1','head2','head3']
 pd.read_csv(your_file.csv,sep='|',names = columns).drop('head2',1).replace('.*=','',regex=True)
2
Onyambu 9 sep. 2018 a las 05:53