我有一个二进制文件,它被打包并重复构建:
struct Record
{
uint32_t a;
double b;
} __attribute__ ((packed));
我正在用Python读取这个二进制文件,代码如下:
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 df
接下来,我会对数据框进行操作,然后希望以相同的格式将其保存到文件中。
我正在尝试这样做:
df.to_numpy(dtype=dt).tofile('/tmp/out2.bin')
但是它的文件大小不如我预期,因为它看起来像使用未修改的数组执行to_numpy(dtype=dt)
并不会得到原始数组。这里是一个可重现的完整示例:
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)
第一次打印将数组的一个结构元素打印出来:
[(67305985, 42.)]
第二个是数据帧(dataframe)
a b
0 67305985 42.0
现在我期望在未修改的数据框上进行to_numpy(dtype=dt)
操作,生成的数组与第一个数组相等,但实际得到的内容却不一样。
[[(67305985, 6.7305985e+07) ( 42, 4.2000000e+01)]]
如何将Pandas数据框转换回原始的一维结构数组?