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

Polars中基于另一列比例的三分法填充Null值

需求目标

我希望通过分配前后非Null值的差值来填充序列中的Null值,分配方式并非线性,而是利用另一列的值计算比例。

示例数据
df = pl.DataFrame({
    "id": ["a", "a", "a", "b", "b", "b", "b", "b"],
    "timestamp": ["2023-09-13 14:05:34", "2023-09-13 14:15:04", "2023-09-13 14:30:01", "2023-09-13 12:12:02", "2023-09-13 12:15:02", "2023-09-13 12:30:07", "2023-09-13 12:45:01", "2023-09-13 13:00:02"],
    "value": [10, None, 30, 5, 10, None, None, 40]
}).with_columns(
    pl.col("timestamp").str.to_datetime(),
)

数据结构如下:

shape: (8, 3)
┌─────┬─────────────────────┬───────┐
│ id  ┆ timestamp           ┆ value │
│ --- ┆ ---                 ┆ ---   │
│ str ┆ datetime[μs]        ┆ i64   │
╞═════╪═════════════════════╪═══════╡
│ a   ┆ 2023-09-13 14:05:34 ┆ 10    │
│ a   ┆ 2023-09-13 14:15:04 ┆ null  │
│ a   ┆ 2023-09-13 14:30:01 ┆ 30    │
│ b   ┆ 2023-09-13 12:12:02 ┆ 5     │
│ b   ┆ 2023-09-13 12:15:02 ┆ 10    │
│ b   ┆ 2023-09-13 12:30:07 ┆ null  │
│ b   ┆ 2023-09-13 12:45:01 ┆ null  │
│ b   ┆ 2023-09-13 13:00:02 ┆ 40    │
└─────┴─────────────────────┴───────┘
预期输出(含计算中间列)
shape: (8, 9)
┌─────┬─────────────────────┬───────┬───────────┬────────────┬────────────────┬─────────┬────────────┬───────┐
│ id  ┆ timestamp           ┆ value ┆ gap value ┆ gap time s ┆ gap proportion ┆ portion ┆ fill value ┆ final │
│ --- ┆ ---                 ┆ ---   ┆ ---       ┆ ---        ┆ ---            ┆ ---     ┆ ---        ┆ ---   │
│ str ┆ datetime[ns]        ┆ str   ┆ f64       ┆ f64        ┆ f64            ┆ f64     ┆ f64        ┆ f64   │
╞═════╪═════════════════════╪═══════╪═══════════╪════════════╪════════════════╪═════════╪════════════╪═══════╡
│ a   ┆ 2023-09-13 14:05:34 ┆ 10    ┆ null      ┆ null       ┆ null           ┆ null    ┆ null       ┆ 10.0  │
│ a   ┆ 2023-09-13 14:15:04 ┆ null  ┆ 20.0      ┆ 1467.0     ┆ 570.0          ┆ 7.77    ┆ 17.77      ┆ 17.77 │
│ a   ┆ 2023-09-13 14:30:01 ┆ 30    ┆ null      ┆ null       ┆ null           ┆ null    ┆ null       ┆ 30.0  │
│ b   ┆ 2023-09-13 12:12:02 ┆ 5     ┆ null      ┆ null       ┆ null           ┆ null    ┆ null       ┆ 5.0   │
│ b   ┆ 2023-09-13 12:15:02 ┆ 10    ┆ null      ┆ null       ┆ null           ┆ null    ┆ null       ┆ 10.0  │
│ b   ┆ 2023-09-13 12:30:07 ┆ null  ┆ 30.0      ┆ 2700.0     ┆ 905.0          ┆ 10.06   ┆ 20.06      ┆ 20.06 │
│ b   ┆ 2023-09-13 12:45:01 ┆ null  ┆ 30.0      ┆ 2700.0     ┆ 1799.0         ┆ 19.99   ┆ 29.99      ┆ 29.99 │
│ b   ┆ 2023-09-13 13:00:02 ┆ 40    ┆ null      ┆ null       ┆ null           ┆ null    ┆ null       ┆ 40.0  │
└─────┴─────────────────────┴───────┴───────────┴────────────┴────────────────┴─────────┴────────────┴───────┘
计算逻辑(以分组b为例)
  • 有2行Null值需要填充;
  • 前后非Null值的差值为30(40-10);
  • 前后非Null值的时间差为2700秒(13:00:02 - 12:15:02);
  • 第一行Null值与前一个非Null值的时间差为905秒,分配比例为30*(905/2700)=10.06,填充值为10+10.06=20.06;
  • 第二行Null值与前一个非Null值的时间差为1799秒,分配比例为30*(1799/2700)=19.99,填充值为10+19.99=29.99。
背景与建议

本人是Polars和Python新手,此前熟悉SQL,希望得到实现方法。同时认为将基于其他列比例的插值填充添加到fill_null功能中会是不错的优化。


内容的提问来源于stack exchange,提问作者Wouter De Raeve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:05:54