Tengo un archivo binario que está empaquetado y construido como repetido:
struct Record { uint32_t a; double b; } __attribute__ ((packed));Estoy leyendo este archivo binario con python así:
def read_file(filename): dt = np.dtype([('a', np.uint32), ('b', np.float64)]) data = np.fromfile(filename, dtype=dt) df = pd.DataFrame(data=data, columns=dt.names) return dfLuego, estoy manipulando los datos en el marco de datos y luego me gustaría guardarlos en un archivo en el mismo formato.
Estoy intentando esto:
df.to_numpy(dtype=dt).tofile('/tmp/out2.bin') Pero si el archivo es lo que esperaba, porque parece que to_numpy(dtype=dt) con una matriz no modificada no da como resultado la matriz original. Aquí hay un ejemplo completo reproducible:
import numpy as np import pandas as pd import io dt = np.dtype([ ('a', np.uint32), ('b', np.float64) ]) data = np.frombuffer(b'\1\2\3\4\x00\x00\x00\x00\x00\x00E@', dtype=dt) print(data) df = pd.DataFrame(data=data, columns=dt.names) print(df) from_df = df.to_numpy(dtype=dt) print(from_df)La primera impresión imprime una matriz de un elemento de estructura:
[(67305985, 42.)]y el segundo un marco de datos
ab 0 67305985 42.0 Ahora esperaría que la to_numpy(dtype=dt) en el marco de datos no modificado haga una matriz que sea igual a la primera, pero en su lugar obtengo algo que se imprime
[[(67305985, 6.7305985e+07) ( 42, 4.2000000e+01)]]¿Cómo convertir el marco de datos de Pandas de nuevo a la matriz de estructuras unidimensional original?
No conozco ninguna buena manera de hacer que los pandas hagan un tipo de estructura.
dt = np.dtype([('a', np.uint32), ('b', np.float64)]) df = read_file(...)Vas a tener que crear una matriz vacía y llenarla tú mismo.
d = np.empty(df.shape[1], dtype=dt) d['a'], d['b'] = df['a'], df['b'] d.tofile('/tmp/out2.bin')