Polars中正确实现((A非NaN或B非NaN)且C非NaN)过滤逻辑的方法
Polars中正确实现((A非NaN或B非NaN)且C非NaN)过滤逻辑的方法
嘿,我看了你遇到的问题啦,咱们来一步步拆解哪里出问题了,然后给你修正后的代码~
你的代码里的两个关键问题:
- 没有保存
with_columns的结果:Polars的DataFrame是不可变的,调用with_columns之后会返回一个新的DataFrame,你需要把它赋值给原变量或者新变量,否则原df不会有新增的Keep列。 - 过滤条件错误:你用了
pl.col("Keep") is True,但在Python里is是用来判断两个对象是否是同一个身份,而不是值相等。在Polars中,布尔列本身就可以直接作为过滤条件,不需要额外判断是否等于True。
修正后的代码:
import polars as pl import numpy as np df = pl.DataFrame( data={ "a": [0.0, 0.0, 0.0, 0.0, np.nan, np.nan, np.nan], "b": [0.0, 0.0, np.nan, np.nan, 0.0, 0.0, np.nan], "c": [0.0, np.nan, 0.0, np.nan, 0.0, np.nan, np.nan] } ) # 先添加Keep列并保存结果 df = df.with_columns( ((pl.col('a').is_not_nan() | pl.col('b').is_not_nan()) & pl.col('c').is_not_nan()).alias('Keep')) # 直接用布尔列过滤,或者用== True也可以 df_actual = df.filter(pl.col("Keep")) # 或者 df_actual = df.filter(pl.col("Keep") == True) print("df\n", df) print("df_actual\n", df_actual)
运行结果:
输出的df_actual就会和你期望的df_expect一致:
shape: (3, 4) ┌─────┬─────┬─────┬──────┐ │ a ┆ b ┆ c ┆ Keep │ │ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 ┆ bool │ ╞═════╪═════╪═════╪══════╡ │ 0.0 ┆ 0.0 ┆ 0.0 ┆ true │ │ 0.0 ┆ NaN ┆ 0.0 ┆ true │ │ NaN ┆ 0.0 ┆ 0.0 ┆ true │ └─────┴─────┴─────┴──────┘
如果不需要保留Keep列,也可以直接在filter里写完整的逻辑,不用先加列:
df_actual = df.filter( ((pl.col('a').is_not_nan() | pl.col('b').is_not_nan()) & pl.col('c').is_not_nan()) )
这样写更简洁,结果也是一样的~
备注:内容来源于stack exchange,提问作者Steve Maguire




