Pandas to_records() dtype转换报错求助:numpy.array可正常运行
问题原因分析
你的错误根源在于Pandas的to_records()方法中column_dtypes参数的用法和numpy.array()的行为不一致,具体两点:
列名不匹配
你创建DataFrame时未指定列名,默认列名是0和1,但传入的myDtype是结构化dtype,字段名为'myID'和'length'。当column_dtypes接收结构化dtype时,Pandas要求DataFrame的列名必须和dtype的字段名完全对应,否则无法正确映射类型,最终导致错误的类型转换尝试(把字符串'myID'强制转成uint16类型,因此抛出ValueError)。column_dtypes参数的用法误解
你直接传入了numpy结构化dtype,但该参数更适合用字典形式(键为DataFrame的列名,值为对应dtype),或者在DataFrame列名和结构化dtype字段名完全一致时才能直接传入结构化dtype。
修复方案
方案1:创建DataFrame时指定匹配的列名
先给DataFrame设置和myDtype字段名一致的列名,再调用to_records():
import pandas as pd import numpy as np data = [('myID', 5), ('myID', 10)] myDtype = np.dtype([('myID', np.str_,4), ('length', np.uint16)]) # 指定列名匹配myDtype的字段名 df = pd.DataFrame(data, columns=['myID', 'length']) # 此时可直接传入myDtype records = df.to_records(index=False, column_dtypes=myDtype) print(records) # 输出: rec.array([('myID', 5), ('myID', 10)], dtype=[('myID', 'U4'), ('length', '<u2')])
方案2:用字典形式传入column_dtypes
如果不想修改DataFrame的列名,直接用字典映射原列名到对应dtype:
df = pd.DataFrame(data) # 字典键是df的列名(0和1),值是对应dtype records = df.to_records(index=False, column_dtypes={0: np.str_(4), 1: np.uint16}) print(records)
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

