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

