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

解决LabelEncoder转换时出现的TypeError: ufunc 'isnan' not supported错误

解决LabelEncoder转换时出现的TypeError: ufunc 'isnan' not supported错误

看起来这个错误是因为你在使用LabelEncoder时,训练集(t)和待转换数据集(df2)的目标列存在数据类型不一致、缺失值处理不统一的问题,导致LabelEncoder在检查未知类别时,无法处理混合类型的数据,触发了isnan函数的类型错误。我给你分步梳理解决方案:

1. 先统一所有目标列的数据类型

LabelEncoder是为处理分类字符串标签设计的,如果你的列里同时存在字符串和数值(比如你把"N/"替换成了-1整数),就会导致类型冲突。先把训练集t和待转换的df2的目标列都转成字符串:

cols = ['County', 'City', 'State', 'ZIP Code', 'Model Year', 'Make', 'Model', 'Electric Vehicle Type', 'Clean Alternative Fuel Vehicle (CAFV) Eligibility']

# 统一转成字符串类型
for col in cols:
    t[col] = t[col].astype(str)
    df2[col] = df2[col].astype(str)

2. 统一缺失值的处理方式

你之前一会儿用-1标记缺失值,一会儿用'Missing',这种不一致会导致LabelEncoder拟合的类别和待转换数据不匹配。我们统一用'Missing'来标记所有缺失/无效值:

# 处理训练集t的缺失值
for col in cols:
    t[col] = t[col].replace('N/', 'Missing').fillna('Missing')

# 处理df2的缺失值,和训练集保持完全一致
for col in cols:
    df2[col] = df2[col].replace('N/', 'Missing').fillna('Missing')

3. 重新使用LabelEncoder拟合和转换

注意每处理一列最好单独初始化一个LabelEncoder实例,避免之前的拟合残留影响结果:

from sklearn import preprocessing

for col in cols:
    le = preprocessing.LabelEncoder()  # 每列重新初始化
    le.fit(t[col])  # 用处理好的训练集拟合
    df2[col] = le.transform(df2[col])  # 转换df2的列
    print(f"列 {col} 的类别列表:{le.classes_}")

额外修正:异常值处理的语法问题

你之前处理Base MSRP异常值的代码有链式索引的风险,建议改成更安全的写法:

uv = np.nanpercentile(df2['Base MSRP'], [99])[0] * 2
# 用loc索引修改值,避免SettingWithCopyWarning
df2.loc[df2['Base MSRP'] > uv, 'Base MSRP'] = uv

为什么之前的方法会报错?

你之前把N/替换成了-1(数值类型),但训练集t里的对应列是字符串类型。当LabelEncoder拟合了字符串类别后,去转换数值类型的数据时,底层的类型检查逻辑会调用isnan函数,而isnan无法处理字符串类型,因此触发了TypeError。

备注:内容来源于stack exchange,提问作者Steve Austin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:20:10