使用SimpleImputer与OrdinalEncoder时遇ValueError问题求助
问题原因解析
核心问题:维度不匹配引发的类型推断错误
sklearn变换方法的返回维度特性:
OrdinalEncoder.inverse_transform()、SimpleImputer.fit_transform()这类sklearn工具的变换方法,返回的都是2维numpy数组(格式为(样本数量, 特征数量)),哪怕只处理单个特征,返回结果也是(n,1)的2维结构。pandas单列赋值的差异逻辑:
- 当赋值的是数值类型的2维数组时(比如编码后的数值),pandas会自动将其降为1维,所以
df["encoded"]=encoder.fit_transform(df[["cat"]])能正常执行。 - 但当赋值的是字符串类型的2维数组时(
inverse_transform还原出的原分类字符串),pandas会触发类型推断流程(比如判断是否为日期时间类型),而负责推断的maybe_infer_to_datetimelike函数强制要求输入为1维数组,此时传入2维数组直接抛出ValueError: 2。
- 当赋值的是数值类型的2维数组时(比如编码后的数值),pandas会自动将其降为1维,所以
flatten()的解决原理:
flatten()将(n,1)的2维数组转换为(n,)的1维数组,完全匹配pandas对单列数据的维度要求,因此赋值成功。
直观验证代码
你可以打印返回值的维度,直接看到差异:
print(encoder.fit_transform(df[["cat"]]).shape) # 输出 (7,1) print(encoder.inverse_transform(df[["encoded_imp"]]).shape) # 输出 (7,1) print(encoder.inverse_transform(df[["encoded_imp"]]).flatten().shape) # 输出 (7,)
内容的提问来源于stack exchange,提问作者NovicePatience
相关产品推荐
相关产品推荐

