You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Numpy dtype读取二进制文件到Pandas DataFrame后删行报错求助

解决Numpy dtype读取二进制文件转DataFrame后的行删除报错问题

用Numpy.dtype模板读取二进制文件生成Pandas DataFrame后,尝试删除行时触发TypeError: void() takes at least 1 positional argument (0 given)错误,IDE变量查看器查看列名时也会出现相同错误,推测是数据导入方式导致的类型兼容问题。

数据加载代码

import numpy as np
import pandas as pd

data_template = np.dtype([
    ('header_a','V22'),
    ('variable_A','>u2'),
    ('gpssec','>u4')
])

with open(source_file, 'rb') as f: 
    byte_data = f.read()
np_data = np.frombuffer(byte_data, data_template)
df = pd.DataFrame(np_data)

触发错误的操作

执行行筛选操作时触发报错:

df = df[df['gpssec'] > 1000]

报错栈

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\frame.py:3798 in __getitem__
  return self._getitem_bool_array(key)

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\frame.py:3853 in _getitem_bool_array
  return self._take_with_is_copy(indexer, axis=0)

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\generic.py:3902 in _take_with_is_copy
  result = self._take(indices=indices, axis=axis)

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\generic.py:3886 in _take
  new_data = self._mgr.take(

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\internals\managers.py:978 in take
  return self.reindex_indexer(

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\internals\managers.py:751 in  reindex_indexer
  new_blocks = [

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\internals\managers.py:752 in <listcomp>
  blk.take_nd(

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\internals\blocks.py:880 in take_nd
  new_values = algos.take_nd(

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\array_algos\take.py:117 in take_nd
  return _take_nd_ndarray(arr, indexer, axis, fill_value, allow_fill)

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\array_algos\take.py:134 in _take_nd_ndarray
  dtype, fill_value, mask_info = _take_preprocess_indexer_and_fill_value(

File C:\ProgramData\anaconda311\Lib\site-packages\pandas\core\array_algos\take.py:582 in _take_preprocess_indexer_and_fill_value
  dtype, fill_value = arr.dtype, arr.dtype.type()

TypeError: void() takes at least 1 positional argument (0 given)

临时解决方法

目前只能将相关列数据复制到无损坏列名的空DataFrame中,但操作繁琐,寻求更优方案。

根本原因与解决方案

原因

问题出在'V22'类型的header_a字段上:这是Numpy的void类型,Pandas在处理void类型数组时,会尝试生成默认填充值arr.dtype.type(),但void类型的构造函数必须传入参数,因此触发报错。

方案1:转换void类型字段格式

把header_a字段从void类型转为字节字符串或Unicode字符串,避免Pandas处理void类型:

# 转为字节字符串
data_template = np.dtype([
    ('header_a','S22'),
    ('variable_A','>u2'),
    ('gpssec','>u4')
])

# 或转为Unicode字符串
data_template = np.dtype([
    ('header_a','U22'),
    ('variable_A','>u2'),
    ('gpssec','>u4')
])

如果不需要header_a字段,也可以直接删除该列:

df = pd.DataFrame(np_data).drop('header_a', axis=1)

方案2:使用Pandas from_records方法

改用pd.DataFrame.from_records生成DataFrame,该方法会自动将void类型转为object类型的字节数组,避免填充值构造错误:

df = pd.DataFrame.from_records(np_data)

内容的提问来源于stack exchange,提问作者B F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:40:39