You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Polars Lazy API删除全为Null值的列?

使用Polars Lazy API删除全Null值列的解决方案

核心实现代码

针对你的示例数据,用Polars Lazy API删除全Null列(比如示例中的列"a"),可以用以下两种方式实现:

方法一:逐列判断(适合少量列场景)

df = pl.DataFrame(
    {
        "a": [None, None, None, None],
        "b": [1, 2, None, 1],
        "c": [1, None, None, 1],
    }
)

# 转为LazyFrame开启延迟计算
lf = df.lazy()

# 筛选出非全Null的列并执行查询
result = lf.select(
    [col for col in lf.columns if not lf.select(col).null_count().collect().item() == lf.height]
).collect()

print(result)

方法二:批量计算Null计数(更高效,适合多列场景)

df = pl.DataFrame(
    {
        "a": [None, None, None, None],
        "b": [1, 2, None, 1],
        "c": [1, None, None, 1],
    }
)

lf = df.lazy()

# 一次性计算所有列的Null数量,转为字典便于筛选
null_counts = lf.select(pl.all().null_count()).collect().to_dict(as_series=False)
# 保留Null数量不等于总行数的列
keep_cols = [col for col, cnt in null_counts.items() if cnt[0] != lf.height]

# 执行查询得到结果
result = lf.select(keep_cols).collect()

print(result)

执行结果

两种方法都会得到去掉全Null列"a"的结果:

shape: (4, 2)
┌──────┬──────┐
│ b    ┆ c    │
│ ---  ┆ ---  │
│ i64  ┆ i64  │
╞══════╪══════╡
│ 1    ┆ 1    │
│ 2    ┆ null │
│ null ┆ null │
│ 1    ┆ 1    │
└──────┴──────┘

关键说明

  1. Lazy API特性:通过df.lazy()转为LazyFrame后,所有操作都会延迟到调用collect()时执行,适合大数据场景(无需提前加载全量数据到内存)。
  2. 判断逻辑:核心是对比列的null_count()和总行数lf.height,如果相等则说明该列全为Null,需要剔除。
  3. 与非Lazy方法的区别:你提到的非Lazy方法是直接在DataFrame上操作,而Lazy API可以和其他延迟操作(如读取大文件、过滤行、列转换)链式调用,进一步优化性能。
  4. 替代Pandas dropna:Polars目前没有直接支持axis和how参数的全局删除函数,但通过上述方式可以完全实现Pandasdropna(axis=1, how='all')的效果。

内容的提问来源于stack exchange,提问作者B.H. Chiang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 23:24:57