You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动