One hot Encoding处理object/string类型变量报flexible type错误
问题现象
- 对DataFrame中2个原始类型为
object的变量执行独热编码(One-Hot Encode)操作时,第一个变量编码正常,第二个变量编码失败 - 尝试将两个变量统一转换为
string类型后重新编码,仍然抛出错误,错误信息为:cannot perform reduce with flexible type - 报错分别出现在原始object类型编码、转换为string类型后编码两个场景
报错根因
该报错的核心原因是编码失败的列内存在非原子类的异常值,仅修改列的dtype不会改变列内实际存储的元素类型,常见触发场景包括:
- 列内混入嵌套结构值:比如存储了列表、字典、numpy数组等非标量值
- 列内元素类型不统一:同时存在字符串、数值、空值对象等多种类型的元素
- 空值标记混乱:同时存在
None、np.nan、自定义空字符串等多种空值表示,编码器做类别统计时无法正常聚合
解决步骤
- 先定位异常值,执行以下代码校验失败列的实际元素类型分布:
# 将col_name替换为编码失败的实际列名 df['col_name'].apply(type).value_counts()
如果输出结果不全是<class 'str'>,存在list/dict/numpy.ndarray/float等其他类型,即可确认异常来源。
- 针对异常值做清洗:
- 如果存在嵌套结构值,先将嵌套值转换为标量字符串,例如下方代码将可迭代的非字符串值转换为逗号拼接的字符串,其余值统一转字符串:
df['col_name'] = df['col_name'].apply( lambda x: ','.join(map(str, x)) if hasattr(x, '__iter__') and not isinstance(x, str) else str(x) )
- 如果存在混合类型空值,先统一填充空值再做类型转换:
df['col_name'] = df['col_name'].fillna('missing').astype(str)
- 清洗完成后再执行独热编码,优先使用pandas原生
pd.get_dummies兼容性更强:
# 传入需要编码的列名列表即可 encoded_result = pd.get_dummies(df, columns=['正常编码的列名', '清洗完成的列名'])
注意:pandas的
object、string类型仅标记列的存储格式,不会强制约束列内元素的类型,必须逐元素校验值类型后再送入编码器,才能避免此类报错。
内容的提问来源于stack exchange,提问作者Adam D. Silva
相关产品推荐
相关产品推荐

