Polars转换为pl.List后计算熵报错,求问题原因及解决办法
问题原因分析
错误核心是Polars的entropy()函数默认作用于单值数值列,而非列表类型列。当你对List(Float64)类型列直接调用entropy()时,Polars会尝试将整个列表转换为单个Float64值,这显然不成立,因此抛出类型转换错误。
另外还有隐藏问题:用str.split(",")分割后得到的列表元素带空格(比如" 2"),直接cast(pl.List(pl.Float64))会因字符串格式错误失败,只是被类型转换错误先触发了报错。
解决方案
要计算每个列表的熵,需要用Polars的数组方法arr.eval(),让entropy()作用于列表内部的元素;同时先清理列表元素的空格。
修正后的代码如下:
import polars as pl df = pl.DataFrame({"Result": "1, 2, 3"}) # 分割字符串→清理空格→转数值列表→计算每个列表的熵 result = df.select( pl.col("Result") .str.split(",") .arr.eval(pl.element().str.strip().cast(pl.Float64)) .arr.eval(pl.col().entropy()) ) print(result)
执行后输出每个列表对应的熵值:
shape: (1, 1) ┌──────────┐ │ Result │ │ --- │ │ f64 │ ╞══════════╡ │ 1.098612 │ └──────────┘
补充说明
arr.eval()用于对列表内的元素执行操作,或对整个列表内部的数值调用聚合函数(如entropy())。- 必须先清理元素空格,否则字符串转数值的错误会在类型转换错误之后触发。
内容的提问来源于stack exchange,提问作者AnthonyML
相关产品推荐
相关产品推荐

