如何通过表达式筛选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
相关产品推荐
相关产品推荐

