解决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
相关产品推荐
相关产品推荐

