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

将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

解决步骤

  1. 先排查列类型:
# 打印所有列的数据类型,定位问题列
print(dataframe.dtypes)
  1. 针对性处理:
  • 缺失值问题:填充缺失值后转换类型,例如:
    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})
    
  1. 更稳妥的转换方式:
    避免直接用values,改用to_numpy()指定类型或直接用torch.tensor():
# 转换数值列为float32类型的张量
tens = torch.tensor(dataframe.select_dtypes(include=['number']).to_numpy(dtype='float32'))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:45:17