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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:40:21