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

如何用Polars原生语法删除所有值相同的列?

Polars删除所有值相同列的原生实现方法

首先,我们有如下Polars DataFrame:

import polars as pl

df = pl.DataFrame(
    {
        "col1": [1, 2, 3, 4, 5],
        "col2": [10, 20, 30, 40, 50],
        "col3": [42, 42, 42, 42, 42],
        "col4": [7.5, 7.5, 7.5, 7.5, 7.5],
    }
)

需求是删除所有值完全相同的列,你原本通过循环筛选唯一值数量为1的列再删除:

static_cols = []
for col in df.columns:
    if df[col].n_unique() == 1:
        static_cols.append(col)

df.drop(static_cols)

执行后得到结果:

shape: (5, 2)
┌──────┬──────┐
│ col1 ┆ col2 │
│ ---  ┆ ---  │
│ i64  ┆ i64  │
╞══════╪══════╡
│ 1    ┆ 10   │
│ 2    ┆ 20   │
│ 3    ┆ 30   │
│ 4    ┆ 40   │
│ 5    ┆ 50   │
└──────┴──────┘

Polars原生实现方案

不需要手动循环,用Polars原生语法可以更简洁地实现:

方案1:使用select结合列筛选

通过pl.all()选中所有列,再用filter对每个列(Series)判断唯一值数量,保留唯一值大于1的列:

df.select(pl.all().filter(lambda s: s.n_unique() > 1))

方案2:用drop配合列筛选

先筛选出需要删除的列,再传入drop方法:

# 先获取所有唯一值为1的列名
cols_to_drop = df.select(pl.all().filter(lambda s: s.n_unique() == 1)).columns
df.drop(cols_to_drop)

方案3:列表推导式简化(半原生)

如果觉得lambda不够直观,也可以用列表推导式直接生成保留的列名,比原循环更简洁:

df.select([col for col in df.columns if df[col].n_unique() > 1])

关于你尝试的写法说明

你尝试的两种写法无法生效:

  • df.drop(pl.col(col).n_unique() == 1 for col in df.columns):pl.col(col).n_unique() ==1返回的是列表达式,而drop方法需要传入列名字符串的集合,不是表达式迭代器,因此无法识别。
  • df.drop(pl.when(pl.col(col).n_unique() == 1).then(col).otherwise(None) for col in df.columns):pl.when是针对行级数据的条件判断逻辑,无法用于列层面的筛选,因此也无法得到正确的列名集合。

内容的提问来源于stack exchange,提问作者Lethnis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 00:34:53