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

如何将Pandas DataFrame转换为带指定数据类型的Numpy结构体数组?

解决方案:将Pandas DataFrame转换为指定dtype的Numpy结构化数组

解决这个问题很简单,Pandas和Numpy本身就有高效的内置方法,完全不需要手动循环。这里有两种推荐的实现方式:

方法1:使用DataFrame.to_records()(最直观)

这个方法专门用于将DataFrame转换为结构化的记录数组,你可以直接指定目标dtype:

import pandas as pd
import numpy as np

df = pd.DataFrame({ "name": ["John", "Bill", "William"], "age": [25, 34, 41], })

# 转换时去掉索引列,同时指定目标结构化dtype
structured_arr = df.to_records(index=False, dtype=[("name", "U16"), ("age", np.int32)])

print(structured_arr.dtype)
# 输出: [('name', '<U16'), ('age', '<i4')]
print(structured_arr.dtype.fields)
# 输出: {'name': (dtype('<U16'), 0), 'age': (dtype('int32'), 64)}

index=False参数会去掉DataFrame默认的索引列,确保生成的数组只包含你需要的字段;dtype参数直接传入你定义的结构化类型,完美匹配你想要的结果。

方法2:使用DataFrame.to_numpy()指定dtype

如果你更习惯用to_numpy(),也可以直接在调用时传入目标结构化dtype:

import pandas as pd
import numpy as np

df = pd.DataFrame({ "name": ["John", "Bill", "William"], "age": [25, 34, 41], })

target_dtype = np.dtype([("name", "U16"), ("age", np.int32)])
structured_arr = df.to_numpy(dtype=target_dtype, copy=False)

print(structured_arr.dtype)
# 输出: [('name', '<U16'), ('age', '<i4')]

copy=False参数可以避免不必要的内存复制(如果原数据的内存布局兼容的话),进一步提升性能。


为什么你之前的方法不行?

你之前调用df.to_numpy()得到object dtype数组的原因是:当DataFrame包含不同类型的列时,Numpy默认会将整个数组的dtype设为object,把每行当成一个Python对象的集合,而不是结构化的Numpy类型。这种情况下,数组没有fields属性,自然无法查看每个字段的具体类型信息。


两种方法都是基于矢量化操作的内置实现,完全符合你对性能和避免Python原生循环的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:57:32