pandas读取CSV转torch.float32张量报错 字符串列转float失败
问题根源
直接调用astype(float)转换SpType列失败的核心原因是:该列存储的是恒星光谱分类字符串(如G2、K5、M0这类字母+数字的分类值),并非可直接解析为浮点数的纯数字字符串,强制转float会触发值错误,导致列实际类型仍为object。后续用包含该列的DataFrame转numpy数组时,整个数组会被识别为*numpy.object_*类型,而PyTorch张量不支持该类型输入,因此触发报错。
可行解决方案
不要直接强制将字符串格式的分类值转为float,先对SpType列做数值编码,再执行后续转换操作:
- 第一步:对SpType列做数值映射。恒星光谱类型本身对应明确的恒星温度序列,可以按天文规则映射为连续数值,也可根据需求采用通用分类编码方案:
import pandas as pd import torch data = pd.read_csv("/content/Star3642_balanced.csv") # 光谱主型按温度从高到低映射为数值,如需保留子类型精度可额外解析后缀数字做更细粒度映射 sp_type_map = {'O': 0, 'B': 1, 'A': 2, 'F': 3, 'G': 4, 'K': 5, 'M': 6} # 提取SpType首字母匹配映射规则 data["SpType"] = data["SpType"].str[0].map(sp_type_map) # 校验是否存在未匹配到的空值,避免后续类型转换出错 print("SpType列未映射空值数:", data["SpType"].isna().sum())
- 第二步:统一转换所有特征列为数值类型后再转numpy数组
feature_cols = ["Vmag", "Plx", "e_Plx", "B-V", "SpType", "Amag"] # 提前将所有特征列统一转为float32,避免类型混杂导致numpy数组变为object类型 data[feature_cols] = data[feature_cols].astype("float32") X_orig = data[feature_cols].to_numpy()
- 第三步:转换为PyTorch张量,此时不会触发类型错误
X = torch.tensor(X_orig, dtype=torch.float32) # 可打印张量信息校验结果 print(f"张量形状:{X.shape}, 张量数据类型:{X.dtype}")
注意:如果之前执行
data["SpType"] = data.SpType.astype(float)没有抛出明显报错,可以先执行print(data["SpType"].dtype)校验列类型,只要输出不是float32/float64就说明转换实际未生效,需要先排查列内是否存在空值、非法字符串等无法转浮点的内容。
如果不需要将SpType处理为连续数值,也可以采用独热编码处理该分类列,但注意独热编码会增加特征维度,要提前匹配后续模型的输入形状要求。
内容的提问来源于stack exchange,提问作者S C
相关产品推荐
相关产品推荐

