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

如何在Polars中实现类似pandas用其他列数据填充空值的功能?

Polars 跨列填充空值实现方案

Polars 没有直接兼容 pandas 那种传入字典映射列的fillna用法,但可以通过原生表达式语法更简洁的实现同等效果,且性能更优。

原代码不生效的核心原因

  1. Polars 的fill_null方法不支持 pandas 风格的{列名: 填充列}字典入参,仅支持固定值、表达式作为填充来源
  2. 不推荐使用df[:, ["A"]] = ...这类 pandas 风格的原位赋值,Polars 官方更推荐使用with_columns方法链修改列,避免不可预期的错误

单列填充实现(A列空值用D列填充)

将你原代码最后的赋值语句替换为如下写法即可生效:

df = df.with_columns(
    pl.col("A").fill_null(pl.col("D"))
)

多列批量填充实现(A/B/C列空值都用D列填充)

Polars 支持一次选择多列批量应用规则,比 pandas 写字典的方式更简洁:

df = df.with_columns(
    # 同时处理A、B、C三列的空值,都用D列填充
    pl.col(["A", "B", "C"]).fill_null(pl.col("D"))
)

完整可运行优化版代码

import polars as pl

df = pl.DataFrame({
    "date": ["2020-01-01 00:00:00", "2020-01-07 00:00:00", "2020-01-14 00:00:00"],
    "A": [3, 4, 7],
    "B": [3, 4, 5],
    "C": [0, 1, 2],
    "D": [1, 2, 5]
}).with_columns(pl.col("date").str.to_datetime())

# 生成连续日期序列,优化为直接用duration计算,避免手动转时间戳
date_range = df.select(
    pl.int_range(
        pl.col("date").min(), 
        pl.col("date").max() + pl.duration(days=1), 
        step=pl.duration(days=1)
    ).alias("date")
)

df = date_range.join(df, on="date", how="left")

# 一次性完成D列前向填充、ABC列空值填充
df = df.with_columns(
    pl.col("D").fill_null(strategy="forward"),
    pl.col(["A", "B", "C"]).fill_null(pl.col("D"))
)

print(df)

拓展:多优先级填充场景

如果需要按多列优先级填充(比如A空取B,B空取D),可以用coalesce方法:

df = df.with_columns(
    pl.coalesce("A", "B", "D").alias("A")
)

内容的提问来源于stack exchange,提问作者te_neon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:06:04