如何在Polars DataFrame中无需遍历列即可统计每列的空值数量?
如何在Polars DataFrame中无需遍历列即可统计每列的空值数量?
当然有更省心的方法!Polars自带了专门的聚合函数,能一次性统计所有列的空值数量,不管是普通DataFrame还是LazyFrame都能用,完全不用手动循环遍历列,效率和简洁性都拉满。
1. 针对普通DataFrame的解决方案
直接调用null_count()方法就可以一步到位,代码示例如下:
import polars as pl d = {"foo":[1,2,3, None], "bar":[4,None, None, 6]} df_polars = pl.from_dict(d) # 一键统计所有列的空值数量 null_count_df = df_polars.null_count() print(null_count_df)
运行后会得到一个包含空值统计结果的DataFrame:
shape: (1, 2) ┌─────┬─────┐ │ foo ┆ bar │ │ --- ┆ --- │ │ u32 ┆ u32 │ ╞═════╪═════╡ │ 1 ┆ 2 │ └─────┴─────┘
如果需要转成字典格式,只需要再做一步转换:
null_count_dict = dict(null_count_df.to_dict(as_series=False)) print(null_count_dict) # 输出: {'foo': 1, 'bar': 2}
2. 针对LazyFrame的解决方案
如果用的是LazyFrame,也完全不用分块collect(),直接在LazyFrame上调用null_count(),最后统一执行collect()即可,避免了循环中多次收集数据的性能损耗:
# 创建LazyFrame lazy_df = pl.from_dict(d).lazy() # 先定义统计逻辑,最后统一收集结果 null_count_lazy = lazy_df.null_count().collect() print(null_count_lazy)
输出结果和普通DataFrame的场景完全一致,而且Polars会自动优化查询计划,处理大数据时效率比循环方法高很多。
为什么这个方法更好?
- 简洁性:一行代码替代循环逻辑,可读性更强,不容易出错
- 性能优势:Polars的内置函数是向量化操作,比Python层面的循环快得多,尤其是数据量较大时
- LazyFrame友好:不需要拆分查询多次
collect(),能充分利用Polars的延迟执行优化能力
备注:内容来源于stack exchange,提问作者alvas
相关产品推荐
相关产品推荐

