将DataFrame转为PyTorch Tensor时遇numpy.object_类型转换错误求助
解决DataFrame转PyTorch Tensor的类型转换错误
问题根源
你的DataFrame包含字符串类型列(如Airline name、Depreture Airport)和未转换的时间列,这些列转成numpy数组时会变成object类型,而PyTorch Tensor仅支持数值类型(float/int/complex系列),因此抛出转换错误。
解决方案步骤
核心是将所有非数值列转换为数值类型,具体分为以下几步:
1. 处理时间类列
将时间格式的列(如Depreture Time、Travel Time)转换为分钟数或时间戳等数值:
# 示例:将HH:MM格式的起飞时间转为分钟数 df_1['Depreture Time'] = pd.to_datetime(df_1['Depreture Time'], format='%H:%M').dt.hour * 60 + pd.to_datetime(df_1['Depreture Time'], format='%H:%M').dt.minute # 示例:将"Xh Ym"格式的飞行时间转为分钟数 def time_to_minutes(time_str): if pd.isna(time_str): return 0 hours, minutes = 0, 0 for part in str(time_str).split(): if 'h' in part: hours = int(part.replace('h', '')) elif 'm' in part: minutes = int(part.replace('m', '')) return hours * 60 + minutes df_1['Travel Time'] = df_1['Travel Time'].apply(time_to_minutes)
2. 处理字符串分类列
有两种常用方式将字符串分类转为数值:
方式一:标签编码(Label Encoding)
适合有序分类或类别数量较少的场景,将每个唯一字符串映射为整数:
from sklearn.preprocessing import LabelEncoder label_encoders = {} categorical_cols = ['Airline name ', 'Depreture Airport', '1st Stoppage'] for col in categorical_cols: le = LabelEncoder() # 先转字符串避免空值报错 df_1[col] = le.fit_transform(df_1[col].astype(str)) label_encoders[col] = le # 保存编码器,后续预测时可用
方式二:独热编码(One-Hot Encoding)
适合无顺序的分类变量,生成二进制列避免模型误解类别顺序:
# 对分类列执行独热编码,drop_first避免多重共线性 df_encoded = pd.get_dummies(df_1, columns=['Airline name ', 'Depreture Airport', '1st Stoppage'], drop_first=True)
3. 处理缺失值
若数据存在空值,需先填充(数值列用均值/中位数,分类列用最常见类别):
# 填充数值列空值为均值 numeric_cols = df_1.select_dtypes(include=['int64', 'float64']).columns df_1[numeric_cols] = df_1[numeric_cols].fillna(df_1[numeric_cols].mean()) # 填充分类列空值为最常见类别 for col in categorical_cols: df_1[col] = df_1[col].fillna(df_1[col].mode()[0])
4. 转换为PyTorch Tensor
确认所有列均为数值类型后,即可转换:
# 若用标签编码后的原df train_x = torch.tensor(df_1.values, dtype=torch.float32) # 若用独热编码后的df train_x = torch.tensor(df_encoded.values, dtype=torch.float32)
内容的提问来源于stack exchange,提问作者Mustafa Faris
相关产品推荐
相关产品推荐

