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

泰坦尼克号数据归一化时TypeError:str类型不支持减法运算排查

问题分析与解决

核心原因

你用astype(np.str).astype("float64")转换Age列的操作存在隐性问题:若原数据中存在无法被解析为浮点数的字符串值(比如文本格式的"nan"而非原生np.nan),转换后虽然info()显示Age为float64类型,但你是对整个train_data执行归一化操作——泰坦尼克号数据包含大量字符串列(如Name、Sex、Ticket),这些列会触发字符串运算的错误,和Age列本身的类型无关。

分步解决

1. 正确处理Age列的缺失与异常值

放弃字符串转浮点数的绕路方式,用Pandas原生方法精准处理:

import pandas as pd
import numpy as np

# 读取数据
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

# 将Age列的无效值转为NaN,再替换inf为NaN
train_data['Age'] = pd.to_numeric(train_data['Age'], errors='coerce')
train_data['Age'] = train_data['Age'].replace([np.inf, -np.inf], np.nan)
# 用中位数填充缺失值(也可根据需求用均值、众数)
train_data['Age'].fillna(train_data['Age'].median(), inplace=True)

pd.to_numeric(errors='coerce')会自动将所有无法转为数字的内容转为NaN,比字符串转浮点数的可靠性高得多。

2. 仅对数值型列执行归一化

不要对全量DataFrame做数值运算,先筛选出可参与运算的数值列:

# 筛选出所有数值类型的列
numeric_cols = train_data.select_dtypes(include=['float64', 'int64']).columns
# 仅对数值列执行min-max归一化
train_data[numeric_cols] = (train_data[numeric_cols] - train_data[numeric_cols].min()) / (train_data[numeric_cols].max() - train_data[numeric_cols].min())

3. 验证结果

执行完上述步骤后,可通过以下代码确认数值列类型:

print(train_data[numeric_cols].dtypes)

此时所有参与运算的列均为数值类型,不会再触发字符串运算错误。

关键提醒

  • 永远不要对混合类型的DataFrame直接执行数值运算,必须先筛选出目标数值列
  • 处理异常值时优先使用pd.to_numeric,避免字符串转换带来的隐性数据污染

内容的提问来源于stack exchange,提问作者Data Science Analytics Manager

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:57:11