将Pandas DataFrame转为PyTorch张量时出现类型错误的问题排查
Pandas DataFrame转PyTorch张量时出现numpy.object_类型错误的原因及解决
问题重现
手动创建的DataFrame可正常转换为PyTorch张量,但从CSV读取的DataFrame转换时抛出错误,代码如下:
import pandas import torch # 手动创建的DataFrame转换正常 df = pandas.DataFrame({"spam": [1, 2, 3, 4], "eggs": [5, 6, 7, 8], "ham": [9, 10, 11, 12]}) print(type(df)) # 输出: <class 'pandas.core.frame.DataFrame'> t = torch.from_numpy(df.values) # 从CSV读取的DataFrame转换失败 dataframe = pandas.read_csv('dataset.csv') print(type(dataframe)) # 输出: <class 'pandas.core.frame.DataFrame'> tens = torch.from_numpy(dataframe.values)
错误信息:
TypeError: can't convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool.
核心原因
虽然两者都是DataFrame类型,但内部列的数据类型存在本质差异:
- 手动创建的DataFrame所有列都是数值类型(int),
df.values返回的是数值型numpy数组(如int64),完全符合PyTorch的类型要求。 - 从CSV读取的DataFrame中存在object类型的列,导致
dataframe.values生成了numpy.object_类型的数组。常见触发场景:- 某列包含混合类型数据(如同时有数字和字符串)
- 列中存在缺失值且被识别为object类型
- 包含纯字符串类型的列(如文本、非数值ID)
- CSV读取时自动类型推断错误,将数值列识别为object
解决步骤
- 先排查列类型:
# 打印所有列的数据类型,定位问题列 print(dataframe.dtypes)
- 针对性处理:
- 缺失值问题:填充缺失值后转换类型,例如:
dataframe['target_col'] = dataframe['target_col'].fillna(0).astype(int) - 存在非数值列:筛选出仅数值列再转换,例如:
numeric_df = dataframe.select_dtypes(include=['int64', 'float64']) tens = torch.from_numpy(numeric_df.values) - 类型推断错误:读取CSV时强制指定列类型,例如:
dataframe = pandas.read_csv('dataset.csv', dtype={'col1': int, 'col2': float})
- 更稳妥的转换方式:
避免直接用values,改用to_numpy()指定类型或直接用torch.tensor():
# 转换数值列为float32类型的张量 tens = torch.tensor(dataframe.select_dtypes(include=['number']).to_numpy(dtype='float32'))
内容的提问来源于stack exchange,提问作者Yoogi Kovendhan
相关产品推荐
相关产品推荐

