我正在寻找如何在转换为numpy数组和/或pandas数据帧之前有效过滤掉数据中不需要的部分的指导.数据作为字符串缓冲区(每个记录分别)传递给我的程序,我目前使用np.frombuffer在检索所有记录后构建一个array.

我遇到的问题是,单个记录可能很长,有数千个字段,有时我只需要其中的一小部分.过滤掉这些不需要的字段会增加步骤,并显著降低数据导入的速度.

没有任何过滤,我当前的过程是:

# assume some function here that retrieves one record at a time and appends it to 'data'

data = [b'\x00\x00\x00\x00\x00\x00\xf0?one     \x00\x00\x00\x00\x00\x00Y@',
        b'\x00\x00\x00\x00\x00\x00\x00@two     \x00\x00\x00\x00\x00\x00i@',
        b'\x00\x00\x00\x00\x00\x00\x08@three   \x00\x00\x00\x00\x00\xc0r@',
        b'\x00\x00\x00\x00\x00\x00\x10@four    \x00\x00\x00\x00\x00\x00y@']

final_data = b''.join(data)

arr = np.frombuffer(final_data, dtype=struct_dtypes)
df = pd.DataFrame(arr)

# dataframe
    n1     ch     n2
0  1.0    one  100.0
1  2.0    two  200.0
2  3.0  three  300.0
3  4.0   four  400.0

我目前的过滤解决方案基本上是:

final_data = b''.join(b''.join(buffer[offset: offset + 8] for offset in [0, 16]) for buffer in data)

struct_dtypes = np.dtype([('n1', 'd'), ('n2', 'd')])
arr = np.frombuffer(final_data, dtype=struct_dtypes)
df = pd.DataFrame(arr)

    n1     n2
0  1.0  100.0
1  2.0  200.0
2  3.0  300.0
3  4.0  400.0

分割和重新连接每个记录的中间步骤使得过滤比读取所有内容都慢.如果我先构造完整的数组,然后只返回指定的列,这难道不是浪费内存吗?什么是只读取我想要的字符串缓冲区部分的合适方法?

Update using accepted answer

struct_dtypes = np.dtype({'names': ['n1', 'ch'],
                          'formats': ['d', '8V'],
                          'offsets': [0, 8],
                          'itemsize': 24})

final_data = b''.join(data)

arr = np.frombuffer(final_data, dtype=struct_dtypes)

推荐答案

您可以在dtype construction秒内 for each 字段指定偏移量:

struct_dtypes = np.dtype({'names': ['n1', 'n2'], 'f或mats': ['d', 'd'], 'offsets': [0, 16]})

struct_dtypes = np.dtype({'n1': ('d', 0), 'n2': ('d', 16)})

Update (see comments below):
If you don't read the last element in the rec或d, you need to specify the itemsize:

struct_dtypes = np.dtype({'names': ['n1', 'ch'],
                          'f或mats': ['d', '8V'],
                          'offsets': [0, 8],
                          'itemsize': 24})

Python相关问答推荐

DataFrame groupby函数从列返回数组而不是值

点到面的Y距离

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

使用索引列表列表对列进行切片并获取行方向的向量长度

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

如何使用html从excel中提取条件格式规则列表?

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

使用密钥字典重新配置嵌套字典密钥名

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

什么是最好的方法来切割一个相框到一个面具的第一个实例?

Python中的变量每次增加超过1

ConversationalRetrivalChain引发键错误

如何在PythonPandas 中对同一个浮动列进行逐行划分?

如何获得满足掩码条件的第一行的索引?

对于标准的原始类型注释,从键入`和`从www.example.com `?

根据过滤后的牛郎星图表中的数据计算新系列

Pandas ,快速从词典栏中提取信息到新栏

如何在不遇到IndexError的情况下将基数10的整数转换为基数80?

根据边界点的属性将图划分为子图