如何对Polars LazyFrame不同列中的列表按元素求平均
计算Polars LazyFrame中多列nullable列表的按元素平均值
我有一个Polars LazyFrame,包含3个类型为nullable list[f64]的列,数据创建代码如下:
import polars as pl lf = pl.DataFrame({ "1": [ [0.0, 1.1, 2.2], [0.0, 1.1, 2.2], [0.0, 1.1, 2.2], None, ], "2": [ [0.3, 1.3, 2.3], [0.4, 1.4, 2.4], [0.5, 1.5, 2.5], None, ], "3": [ [0.7, 1.7, 2.7], None, [0.9, 1.9, 2.9], None, ], }).lazy()
对应数据表格:
┌─────────────────┬─────────────────┬─────────────────┐ │ 1 ┆ 2 ┆ 3 │ │ --- ┆ --- ┆ --- │ │ list[f64] ┆ list[f64] ┆ list[f64] │ ╞═════════════════╪═════════════════╪═════════════════╡ │ [0.0, 1.1, 2.2] ┆ [0.3, 1.3, 2.3] ┆ [0.7, 1.7, 2.7] │ │ [0.0, 1.1, 2.2] ┆ [0.4, 1.4, 2.4] ┆ null │ │ [0.0, 1.1, 2.2] ┆ [0.5, 1.5, 2.5] ┆ [0.9, 1.9, 2.9] │ │ null ┆ null ┆ null │ └─────────────────┴─────────────────┴─────────────────┘
需要添加一列,计算这三列列表的按元素平均值,具体要求:
- 当某一行全为null时,平均值为长度为3的全零列表
- 当存在null项时,仅基于非null列表计算平均值
这里的“列表平均值”指元素-wise求和后除以参与求和的列表数量。例如:
第一行计算过程:
[ 0.0 + 0.3 + 0.7, 1.1 + 1.3 + 1.7, 2.2 + 2.3 + 2.7 ] / 3 = [ 1.0, 4.1, 7.2 ] / 3 = [0.33, 1.36, 2.40]
第二行结果:[0.0 + 0.4, 1.1 + 1.4, 2.2 + 2.4] / 2 = [0.4, 2.8, 4.6] / 2 = [0.2, 1.4, 2.3]
最后一行结果:[0.0, 0.0, 0.0]
我尝试了一种列求和的方法,但该方法仅在所有行项非空时有效:
lf.select( pl.sum_horizontal( pl.all().list.explode() ).reshape((1, -1)).alias("sum"), ).collect()
内容的提问来源于stack exchange,提问作者Nemoos
相关产品推荐
相关产品推荐

