如何在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
相关产品推荐
相关产品推荐

