如何完成保留NaN缺失值的LabelEncoder分类数据编码流程?
解决LabelEncoder编码后保留NaN的后续步骤
你前面的思路非常合理——先生成缺失值掩码,再把数据转成字符串让LabelEncoder能处理(原生LabelEncoder不支持NaN),接下来只需要把编码后的数据中对应原始缺失的位置恢复成NaN,就可以交给Imputer处理了,具体步骤如下:
1. 将编码结果转换为支持NaN的数据类型
LabelEncoder输出的是整数类型,而整数类型无法存储NaN,所以首先要把编码后的列转换成可以容纳缺失值的类型,比如float或者pandas的可空整数类型Int64:
import numpy as np import pandas as pd from sklearn.preprocessing import LabelEncoder # (你已执行的步骤回顾) df = pd.DataFrame({'A': ['x', np.NaN, 'z'], 'B': [1, 6, 9], 'C': [2, 1, np.NaN]}) mask = df.isnull() df = df.astype(str).apply(LabelEncoder().fit_transform) # 转换数据类型 df = df.astype(float) # 或者用 df = df.astype('Int64') 保留整数特性同时支持NaN
2. 用掩码恢复缺失值
直接利用之前生成的mask,把对应位置的值重新设为np.nan:
df[mask] = np.nan
执行完这两步后,你的数据框会变成这样:
A B C 0 1.0 1 2.0 1 NaN 6 1.0 2 2.0 9 NaN
3. 后续用Imputer处理缺失值
现在数据中的分类列(A)已经完成编码且保留了缺失值,数值列(B、C)的缺失值也保持原样,你可以直接用SimpleImputer来填充缺失值了,比如用众数填充分类列、均值填充数值列(或者根据你的需求选择策略):
from sklearn.impute import SimpleImputer # 针对分类列和数值列可以分别设置策略,这里示例用统一的众数填充 imputer = SimpleImputer(strategy='most_frequent') df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
补充说明
你之前把df转成字符串的操作很关键——原生LabelEncoder无法识别NaN,把NaN转成字符串'NaN'后,它会被当作一个独立的类别被编码,之后再通过掩码还原成NaN,完美解决了LabelEncoder不支持缺失值的问题。
内容的提问来源于stack exchange,提问作者Nasri
相关产品推荐
相关产品推荐

