保存LabelEncoders字典时classes_属性被最后一个编码器覆盖
问题分析与解决
问题根源:你全程复用了同一个
LabelEncoder实例le,每次调用le.fit()都会覆盖这个实例的内部属性(比如classes_)。字典label_object里存储的是实例的引用,不是独立副本,所以循环结束后所有键指向的都是最后一次fit后的同一个实例,自然所有classes_都变成最后一列的类别。修复方案:每次处理新列时,创建一个新的
LabelEncoder实例,避免复用导致的状态覆盖。
修改后的代码:
from sklearn.preprocessing import LabelEncoder label_object = {} for col in data: if data[col].dtype == 'object': unique_vals = data[col].unique() # 注意:原注释写的是"If 2 or fewer unique categories",但代码判断的是>=2,确认逻辑是否符合你的需求 if len(unique_vals) >= 2: # 每次循环创建新的LabelEncoder实例 le = LabelEncoder() le.fit(data[col]) label_object[col] = le # 转换当前列数据 data[col] = le.transform(data[col])
补充说明:
- 原代码里重复写了两次
label_object[col] = le,属于冗余操作,去掉一次即可。 - 检查注释和代码逻辑是否匹配:如果你的需求是处理类别数≤2的列,需要把
len(unique_vals) >= 2改成len(unique_vals) <= 2。
内容的提问来源于stack exchange,提问作者Metel Stairs
相关产品推荐
相关产品推荐

