将numpy读入pandas数据框并写回文件

4

我有一个二进制文件,它被打包并重复构建:

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数据框转换回原始的一维结构数组?

1
看起来使用带有结构数据类型的 to_numpy 会把事情搞糟。非常糟糕。 - Antti Haapala -- Слава Україні
3
我认为这段代码的意思是:将DataFrame转换成不带索引的记录数组,并将其转换为字节形式。/@AnttiHaapala--СлаваУкраїні - piRSquared
@piRSquared 看起来没错...但它实际上不允许直接使用结构体dtype,这有点遗憾。 - Antti Haapala -- Слава Україні
1个回答

0

我不知道有什么好方法让pandas生成结构化数据类型。

dt = np.dtype([('a', np.uint32),
               ('b', np.float64)])

df = read_file(...)

你需要创建一个空数组并自己填充。

d = np.empty(df.shape[1], dtype=dt)
d['a'], d['b'] = df['a'], df['b']

d.tofile('/tmp/out2.bin')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接