如何用Polars表达式通过列非空值采样填充DataFrame空值?
在Polars中用表达式实现空值随机采样填充
完全可以用Polars表达式语法实现,不用写Python循环,代码更简洁且性能更优。
实现思路
针对每一列,提取其非空值集合,然后对该列的空值位置,随机采样对应数量的非空值进行填充,全程保持列数据类型一致。
代码示例
首先定义示例DataFrame:
import polars as pl daf = pl.DataFrame({ "a": [1,2, None, None, 5, 6, None, None, None, 10], "b": [None, "two", "three", None, "five", "six", "seven", None, "nine", "ten"] })
然后用Polars表达式完成填充:
filled_daf = daf.with_columns( pl.all().map_batches( lambda col: col.fill_null( pl.Series( col.drop_nulls().sample( n=col.is_null().sum(), replace=True, shuffle=True ) ) ) ) )
代码说明
pl.all():一次性选中所有列,无需逐个列指定map_batches():对每个列独立执行填充逻辑,保证列级别的处理隔离col.drop_nulls():获取当前列的所有非空值,作为采样池sample(...):采样数量等于当前列的空值总数,replace=True允许重复采样(避免非空值数量不足时报错),shuffle=True保证采样结果随机pl.Series():将采样结果转为与原列类型一致的序列,确保填充后列类型不改变fill_null():用生成的采样序列替换原列的空值
每次运行代码得到的填充结果都会不同,符合“填充值不固定为同一值”的要求,且完全保留原列的数据类型。
内容的提问来源于stack exchange,提问作者Swandog
相关产品推荐
相关产品推荐

