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

如何在Polars DataFrame列中正确应用scikit-learn的LabelEncoder?

用scikit-learn LabelEncoder编码Polars DataFrame分类列的问题

问题重现

我尝试用LabelEncoder处理Polars DataFrame的分类列,写了如下代码:

import polars as pl
from sklearn.preprocessing import LabelEncoder

df = pl.DataFrame({
    "Color" : ["red","white","blue"]
})

enc = LabelEncoder()

执行后报错:

ValueError: y should be a 1d array, got an array of shape () instead.

后来尝试把列转成NumPy数组,代码改成这样:

df.with_columns(
    enc.fit_transform(pl.col("Color").to_numpy()) 
)

又遇到新错误:

AttributeError: 'Expr' object has no attribute 'to_numpy'

我知道用pl.col("Color").cast(pl.Categorical).to_physical()能得到编码结果,但需要像transform()那样统一处理训练和测试数据集。

解决方案

核心问题说明

pl.col("Color")返回的是Polars表达式对象,属于延迟计算语法,不能直接调用to_numpy()。必须先提取列的实际数据,再交给LabelEncoder处理。

1. 训练集编码(拟合+转换)

先提取列数据为NumPy数组或Python列表,再用LabelEncoder拟合并转换:

import polars as pl
from sklearn.preprocessing import LabelEncoder

df = pl.DataFrame({
    "Color" : ["red","white","blue"]
})

enc = LabelEncoder()
# 提取列数据,拟合并转换
encoded_vals = enc.fit_transform(df["Color"].to_numpy())
# 将编码结果加入原DataFrame
df = df.with_columns(pl.Series(encoded_vals).alias("Color_encoded"))

2. 测试集编码(仅转换)

训练好编码器后,用同样逻辑处理测试集,保证编码映射和训练集一致:

# 测试集示例
test_df = pl.DataFrame({
    "Color": ["blue", "red", "white", "red"]
})

# 用已拟合的编码器转换测试集
test_encoded_vals = enc.transform(test_df["Color"].to_numpy())
test_df = test_df.with_columns(pl.Series(test_encoded_vals).alias("Color_encoded"))

3. Polars表达式风格实现(map_elements)

如果想在Polars表达式链里完成转换,可用map_elements方法适配链式操作场景:

# 先拟合编码器
enc.fit(df["Color"].to_list())

# 训练集转换
df = df.with_columns(
    pl.col("Color")
    .map_elements(lambda x: enc.transform([x])[0], return_dtype=pl.Int32)
    .alias("Color_encoded")
)

# 测试集转换
test_df = test_df.with_columns(
    pl.col("Color")
    .map_elements(lambda x: enc.transform([x])[0], return_dtype=pl.Int32)
    .alias("Color_encoded")
)

额外提示

如果测试集出现训练集没有的类别,可通过LabelEncoder的handle_unknown参数(scikit-learn 1.2+支持)控制处理逻辑,比如设置handle_unknown="ignore"或handle_unknown="error",避免报错或未知编码问题。

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:26:20