如何在Polars中实现类似pandas用其他列数据填充空值的功能?
Polars 跨列填充空值实现方案
Polars 没有直接兼容 pandas 那种传入字典映射列的fillna用法,但可以通过原生表达式语法更简洁的实现同等效果,且性能更优。
原代码不生效的核心原因
- Polars 的
fill_null方法不支持 pandas 风格的{列名: 填充列}字典入参,仅支持固定值、表达式作为填充来源 - 不推荐使用
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
相关产品推荐
相关产品推荐

