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

如何完成保留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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:08:28