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

如何在Polars中按列表总和归一化列表元素

解决方案

错误原因

你遇到的ComputeError是因为在list.eval的闭包内部,不能直接通过命名列(如pl.col('a'))引用当前列表列。闭包的作用域限定在单个列表内部,需要用pl.col("")来指代当前正在处理的列表列。

方法一:修复list.eval写法

直接修改闭包内的引用方式,用pl.col("")替代pl.col('a')即可:

import polars as pl

df = pl.DataFrame({'a': [[1,2,3], [4, 5, 6, 7]]})
result = df.select(pl.col('a').list.eval(pl.element() / pl.col("").sum()))
print(result)

执行后会输出目标结果:

shape: (2, 1)
┌──────────────────────────────────┐
│ a                                │
│ ---                              │
│ list[f64]                        │
╞══════════════════════════════════╡
│ [0.166667, 0.333333, 0.5]        │
│ [0.181818, 0.227273, … 0.318182] │
└──────────────────────────────────┘

方法二:利用Polars广播机制(更简洁高效)

不需要使用list.eval,直接让列表列除以其每行的总和即可。Polars会自动将标量(每行的列表总和)广播到列表的每个元素上:

import polars as pl

df = pl.DataFrame({'a': [[1,2,3], [4, 5, 6, 7]]})
result = df.select(pl.col('a') / pl.col('a').list.sum())
print(result)

这个方法代码更简洁,性能也更优,避免了list.eval的闭包调用开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:48:21