如何让Polars的map_elements方法作用于包含null的所有值?
解决Polars中map_elements跳过Null值的问题
1. 让map_elements处理所有值(包括Null)
Polars的map_elements方法默认启用skip_nulls=True参数,这就是Null值被跳过的原因。只需显式设置skip_nulls=False,就能让函数作用于每一个元素,包括Null:
import polars as pl df = pl.DataFrame({"foo": [1, None, 3], "bar": [-1, None, 8]}) def print_and_fill(value): print("Value is", value) return 1 # 设置skip_nulls=False,处理所有元素 result = df["foo"].map_elements(print_and_fill, skip_nulls=False) print(result)
执行后输出:
Value is 1 Value is None Value is 3 shape: (3,) Series: 'foo' [i64] [ 1 1 1 ]
2. 更优的创建is_null标记列的方法
其实完全不需要用map_elements实现这个需求,Polars提供了原生的is_null()表达式,性能远高于Python函数逐元素处理,代码也更简洁:
df = df.with_columns( is_foo_null=pl.col("foo").is_null(), is_bar_null=pl.col("bar").is_null() )
处理后的数据集:
shape: (3, 4) ┌──────┬──────┬────────────┬────────────┐ │ foo ┆ bar ┆ is_foo_null ┆ is_bar_null │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ bool ┆ bool │ ╞══════╪══════╪════════════╪════════════╡ │ 1 ┆ -1 ┆ false ┆ false │ │ null ┆ null ┆ true ┆ true │ │ 3 ┆ 8 ┆ false ┆ false │ └──────┴──────┴────────────┴────────────┘
原生表达式是Polars的最佳实践,避免了Python层面的循环开销,处理大数据集时优势尤为明显。
内容的提问来源于stack exchange,提问作者NChechulin
相关产品推荐
相关产品推荐

