我正在寻找如何在转换为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)