如何高效地仅对DataFrame的特定列执行fill_null操作?
仅对Polars DataFrame数值列填充空值的优化实现
问题
我想仅对DataFrame的数值列执行fill_null(strategy="zero")操作,目前的实现代码如下,请问有没有更符合Polars风格或者更高效的实现方式?
当前实现代码
import polars as pl import polars.selectors as cs df = pl.DataFrame( [ pl.Series("id", ["alpha", None, "gamma"]), pl.Series("xs", [None, 100, 2]), ] ) final_df = df.select(cs.exclude(cs.numeric())) final_df = final_df.with_columns( df.select(cs.numeric()).fill_null(strategy="zero") ) print(final_df)
当前输出
shape: (3, 2) ┌───────┬─────┐ │ id ┆ xs │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═══════╪═════╡ │ alpha ┆ 0 │ │ null ┆ 100 │ │ gamma ┆ 2 │ └───────┴─────┘
优化实现
你可以直接利用Polars的列选择器和with_columns方法,无需拆分再合并DataFrame,代码更简洁且符合Polars的链式风格:
import polars as pl import polars.selectors as cs df = pl.DataFrame( [ pl.Series("id", ["alpha", None, "gamma"]), pl.Series("xs", [None, 100, 2]), ] ) # 直接针对数值列执行空值填充,保留所有原有列 final_df = df.with_columns( cs.numeric().fill_null(strategy="zero") ) print(final_df)
优势说明
- 代码更简洁:不需要拆分DataFrame再合并,一行
with_columns即可完成目标操作,可读性更强 - 效率更高:避免了中间DataFrame的创建和数据复制,Polars会在同一个查询计划中完成列的修改,执行性能更优
- 符合Polars设计理念:充分利用Polars的列选择器和方法链特性,保持代码的连贯性
内容的提问来源于stack exchange,提问作者bzm3r
相关产品推荐
相关产品推荐

