使用Polars调用sklearn LabelEncoder报错,如何正确传入一维数组?
问题原因与修复方案
问题根源
sklearn的LabelEncoder.fit_transform()方法要求输入是一维数组、列表或Pandas Series,但Polars的列是基于Arrow架构的pl.Series对象,与sklearn的预期输入格式不兼容。直接传入Polars列时,sklearn无法正确解析为一维结构,会误判为0维数组,从而抛出ValueError: y should be a 1d array, got an array of shape () instead错误。
修复方法
方法1:将Polars列转为Numpy数组/列表(兼容sklearn)
把Polars列通过.to_numpy()或.to_list()转换成sklearn能识别的一维结构,再传入fit_transform:
import polars as pl from sklearn.preprocessing import LabelEncoder # 读取数据 df = pl.read_csv("your_data.csv") le = LabelEncoder() # 遍历字符串列编码 for col in df.columns: if col != "price" and df[col].dtype == pl.Utf8: # 转换为numpy数组再编码 encoded_values = le.fit_transform(df[col].to_numpy()) # 将编码结果替换原列 df = df.with_columns(pl.Series(encoded_values).alias(col))
方法2:使用Polars内置分类编码(更推荐)
Polars原生支持分类类型转换,无需依赖sklearn,且是向量化操作,效率更高:
import polars as pl df = pl.read_csv("your_data.csv") # 批量编码所有目标字符串列 df = df.with_columns( [ pl.col(col) .cast(pl.Categorical) # 将字符串转为分类类型 .to_physical() # 转换为对应的整数编码 .alias(col) for col in df.columns if col != "price" and df[col].dtype == pl.Utf8 ] )
这种方式的效果和LabelEncoder一致,还能保留分类映射关系(可通过.cat.categories查看),更符合Polars的原生工作流。
补充说明
如果需要保留编码的映射关系(比如后续逆编码),方法1可以单独存储每个列的LabelEncoder实例;方法2则可以通过df[col].cat.categories获取原字符串与编码的对应关系。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

