Tengo un archivo txt con datos en este formato. Las primeras 3 líneas se repiten una y otra vez.
name=1
grade=A
class=B
name=2
grade=D
class=A
Me gustaría generar los datos en un formato de tabla, por ejemplo:
name | grade | class
1 | A | B
2 | D | A
Estoy luchando por configurar los encabezados y simplemente recorrer los datos. Lo que he intentado hasta ahora es:
def myfile(filename):
with open(file1) as f:
for line in f:
yield line.strip().split('=',1)
def pprint_df(dframe):
print(tabulate(dframe, headers="keys", tablefmt="psql", showindex=False,))
#f = pd.DataFrame(myfile('file1')
df = pd.DataFrame(myfile('file1'))
pprint_df(df)
La salida de eso es
+-------+-----+
| 0 | 1 |
|-------+-----|
| name | 1 |
| grade | A |
| class | B |
| name | 2 |
| grade | D |
| class | A |
+-------+-----+
Realmente no es lo que estoy buscando.
df = pd.read_table(file, header=None)
, haga la siguiente líneanew = df[0].str.split("=", n=1, expand=True)
, y esta sería mi respuesta favorita en términos de "código agradable".%timeit
contra mi respuesta y me sorprendió lo lenta que es la solución de pandas puros. ¡Era aproximadamente x7 más lento en mi máquina (para un archivo txt de entrada muy pequeño)! Con la comodidad viene de arriba, con la cabeza (la mayor parte del tiempo) viene pérdida de rendimiento ...Sé que tienes suficientes respuestas, pero aquí hay otra forma de hacerlo usando el diccionario:
Esto le da la salida como:
Solo para tener otra perspectiva.
fuente
Como tiene una salida, así es como trataría el problema:
Primero cree un índice único basado en la repetibilidad de las columnas,
luego usamos esto para pivotar su marco de datos usando la
crosstab
funciónfuente
Lo que también podría hacer es leer su archivo de texto
file
en bloques de 3, construir una lista anidada y ponerla en un marco de datos:df
sería directamenteNota n. ° 1: Aunque esto genera más líneas de código que una
pandas
solución pura , en mi experiencia es probable que sea más eficiente ya que utiliza menospandas
funciones y, por lo tanto, menos sobrecarga.Nota # 2: En general, argumentaría que sería mejor almacenar sus datos de entrada en otro formato, por ejemplo,
json
ocsv
. eso facilitaría mucho la lectura, por ejemplo, con lapandas
función read_csv en el caso de un archivo csv.fuente
Puede generar esa salida utilizando el módulo Diccionario de Python y Pandas.
Este enfoque puede no ser el más eficiente, pero no utiliza ninguna de las funciones avanzadas de Pandas. Espero eso ayude.
La salida:
fuente
En mi humilde opinión, todas las respuestas actuales parecen demasiado complicadas. Lo que haría, es usar
'='
comosep
parámetropd.read_csv
para leer 2 columnas, y luegopivot
el DataFrame obtenido:Si no desea ese índice de columna de varios niveles en el resultado, puede eliminarlo de la siguiente manera:
fuente