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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:18:28