如何使用Polars筛选指定列中存在null值的所有行?
解决Polars中筛选指定列含Null值行的问题
需求:筛选出DataFrame中指定列至少有一个null值的完整行,无需检查所有列。示例DataFrame如下:
import polars as pl df = pl.from_repr(""" ┌───────┬───────┬─────┬───────┐ │ a ┆ b ┆ c ┆ d │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ bool │ ╞═══════╪═══════╪═════╪═══════╡ │ abc ┆ null ┆ u ┆ true │ │ def ┆ abc ┆ v ┆ true │ │ ghi ┆ def ┆ null┆ true │ │ jkl ┆ uvw ┆ x ┆ true │ │ mno ┆ xyz ┆ y ┆ null │ │ qrs ┆ null ┆ z ┆ null │ └───────┴───────┴─────┴───────┘ """)
尝试以下代码时出现错误:
columns = ["a", "b", "d"] df.filter(pl.any_horizontal(pl.all(*columns).is_null()))
错误信息:SchemaError: invalid series dtype: expected Boolean, got str for series with name "a"
正确实现方法
问题出在pl.all(*columns)的用法上:pl.all()接收的是列选择器而非列名列表,直接传入列名会导致它尝试将这些列作为整体处理,而非逐个检查Null值。
写法一:列表推导式生成表达式
对指定的每一列单独调用is_null(),再用any_horizontal判断任意一列满足条件:
columns = ["a", "b", "d"] result = df.filter(pl.any_horizontal([pl.col(col).is_null() for col in columns])) print(result)
写法二:批量列选择(更简洁)
用pl.col(columns)批量选择目标列,链式调用is_null()和any_horizontal,效果与写法一完全一致:
columns = ["a", "b", "d"] result = df.filter(pl.any_horizontal(pl.col(columns).is_null())) print(result)
预期结果
执行后会筛选出仅a、b、d列中存在Null值的行:
┌───────┬───────┬─────┬───────┐ │ a ┆ b ┆ c ┆ d │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ bool │ ╞═══════╪═══════╪═════╪═══════╡ │ abc ┆ null ┆ u ┆ true │ │ mno ┆ xyz ┆ y ┆ null │ │ qrs ┆ null ┆ z ┆ null │ └───────┴───────┴─────┴───────┘
内容的提问来源于stack exchange,提问作者fanta fles
相关产品推荐
相关产品推荐

