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

为何数值型数据仍触发TypeError:str与int不支持减法运算?

解决Pandas中字符串与数值运算的TypeError问题

问题核心

你遇到的TypeError本质是T列存在字符串类型元素——即便肉眼看不到非数值内容,也可能存在隐藏空格、特殊符号或格式问题,导致无法与整数类型的t_min/t_max列做运算。以下是具体排查和解决步骤:

1. 定位T列的异常数据

先运行以下代码,明确T列的真实类型及异常值:

# 查看各列数据类型
print(df_t.dtypes)

# 查看T列所有元素的类型,找出异常类型
print(df_t['T'].apply(type).unique())

# 筛选出T列无法转换为数值的行
non_numeric_rows = df_t[pd.to_numeric(df_t['T'], errors='coerce').isna()]
print(non_numeric_rows)

这一步能精准定位问题行,比如带空格的' 94.0'、带逗号的'94,0'或其他特殊字符。

2. 清洗并转换T列类型

根据排查结果,针对性处理后转换为数值类型:

情况1:存在空格/格式符号

# 去除字符串两端空格,替换逗号为小数点(如果有)
df_t['T'] = df_t['T'].str.strip().str.replace(',', '.')
# 转换为float,无法转换的设为NaN
df_t['T'] = pd.to_numeric(df_t['T'], errors='coerce')

情况2:读取大型CSV时直接处理类型

针对大型文件,建议读取时就指定类型,避免后续内存浪费:

df_t = pd.read_csv(
    'file.csv',
    converters={'T': lambda x: float(x.strip().replace(',', '.'))}
)

3. 处理转换后的缺失值

如果pd.to_numeric生成了NaN值,根据业务需求选择处理方式:

# 方式1:删除含NaN的行
df_t = df_t.dropna(subset=['T'])

# 方式2:用当日温度均值填充
df_t['T'] = df_t.groupby('date')['T'].transform(lambda x: x.fillna(x.mean()))

4. 简化冗余计算式

你的计算式(T - t_min)/(t_max - t_min)*(t_max - t_min)可直接简化为T - t_min,结果完全等价且更高效:

df_t['HTD'] = df_t['T'] - df_t['t_min']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:42:42