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

