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

如何通过表达式筛选Polars DataFrame的所有列?

如何通过表达式筛选Polars DataFrame的所有列?

嘿,我来帮你解决这个Polars筛选的问题!先看看你给出的示例DataFrame:

import polars as pl

df = pl.DataFrame({
    "id": [1, 2, 3, 4, 5],
    "variable1": [15, None, 5, 10, 20],
    "variable2": [40, 30, 50, 10, None],
})

你提到用pl.all()或者pl.any_horizontal()时出错,大概率是因为没把多列的条件合并成单行的布尔判断——毕竟filter方法需要的是一个单列的布尔序列来决定哪些行保留。下面分两种常见场景给你演示正确的写法:


一、筛选所有列都满足某条件的行(用pl.all() + all_horizontal())

比如你想找所有列都不为空的行,或者所有列的值都符合某个数值条件的行,需要先用pl.all()选中所有列,再用all_horizontal()把每一行的多列布尔结果合并成一个(只有当所有列都满足条件时,该行才返回True)。

示例1:筛选所有列都非空的行

# 写法1:用all_horizontal包裹pl.all()的条件
df_all_non_null = df.filter(pl.all_horizontal(pl.all().is_not_null()))
print(df_all_non_null)

示例2:筛选所有列的值都≥10且非空的行

如果要加数值条件,记得结合非空判断(避免null值干扰):

df_all_ge10 = df.filter(
    pl.all_horizontal(
        (pl.all() >= 10) & pl.all().is_not_null()
    )
)
print(df_all_ge10)

输出结果:

shape: (2, 3)
┌─────┬───────────┬───────────┐
│ id  ┆ variable1 ┆ variable2 │
│ --- ┆ ---       ┆ ---       │
│ i64 ┆ i64       ┆ i64       │
├─────┼───────────┼───────────┤
│ 1   ┆ 15        ┆ 40        │
│ 4   ┆ 10        ┆ 10        │
└─────┴───────────┴───────────┘

二、筛选任意一列满足某条件的行(用pl.any_horizontal())

如果你想找只要有一列满足条件就保留的行,就用pl.any_horizontal()——只要该行任意一列符合条件,就返回True。

示例1:筛选任意一列有空值的行

df_any_null = df.filter(pl.any_horizontal(pl.all().is_null()))
print(df_any_null)

输出结果:

shape: (2, 3)
┌─────┬───────────┬───────────┐
│ id  ┆ variable1 ┆ variable2 │
│ --- ┆ ---       ┆ ---       │
│ i64 ┆ i64       ┆ i64       │
├─────┼───────────┼───────────┤
│ 2   ┆ null      ┆ 30        │
│ 5   ┆ 20        ┆ null      │
└─────┴───────────┴───────────┘

示例2:筛选任意一列的值小于10的行

这里要注意:null值和数值比较会返回null,不会被算作满足条件,所以只有明确小于10的列才会触发筛选:

df_any_lt10 = df.filter(pl.any_horizontal(pl.all() < 10))
print(df_any_lt10)

输出结果:

shape: (4, 3)
┌─────┬───────────┬───────────┐
│ id  ┆ variable1 ┆ variable2 │
│ --- ┆ ---       ┆ ---       │
│ i64 ┆ i64       ┆ i64       │
├─────┼───────────┼───────────┤
│ 1   ┆ 15        ┆ 40        │  # id=1<10
│ 2   ┆ null      ┆ 30        │  # id=2<10
│ 3   ┆ 5         ┆ 50        │  # variable1=5<10
│ 4   ┆ 10        ┆ 10        │  # id=4<10
└─────┴───────────┴───────────┘

为啥你之前会出错?

大概率是直接把pl.all().is_not_null()这类多列表达式传给了filter——Polars的filter只接受返回单列布尔值的表达式,所以必须用all_horizontal或any_horizontal把多列的判断结果合并成单行的布尔值,这样filter才能正确识别哪些行该保留。

备注:内容来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:14:50