Polars 选择所有没有 NaN 的列

问题描述 投票:0回答:1

我有一个数据框,其中许多列仅由 NaN 组成。我试图仅选择数据框中所有值等于使用 Polars 的 NaN 的列。

我尝试看看是否可以使用与 Pandas 中类似的语法,例如

df[df.columns[~df.isnull().all()]]

但是语法无法翻译。 我还知道您可以使用 pl.filter 但这仅根据过滤器表达式中应用的条件过滤行而不是列。

python python-polars
1个回答
6
投票

所以这基本上是用布尔掩码对列进行子集化。

首先让我们创建一些示例数据:

import polars as pl
import numpy as np

df = pl.DataFrame({
    "a": [np.nan, np.nan, np.nan, np.nan],
    "b": [3.0, 4.0, np.nan, 5.0], 
    "c": [np.nan, np.nan, np.nan, np.nan]
})

接下来我们必须判断一列是否完全由 NaN 值组成

df.select(pl.all().is_not_nan().any())
shape: (1, 3)
┌───────┬──────┬───────┐
│ a     ┆ b    ┆ c     │
│ ---   ┆ ---  ┆ ---   │
│ bool  ┆ bool ┆ bool  │
╞═══════╪══════╪═══════╡
│ false ┆ true ┆ false │
└───────┴──────┴───────┘

为了让这个 DataFrame 可迭代,我们使用 row 函数

df.select(pl.all().is_not_nan().any()).row(0)
# (False, True, False)

我们现在可以在括号符号中使用它

df[:, df.select(pl.all().is_not_nan().any()).row(0)]
shape: (4, 1)
┌─────┐
│ b   │
│ --- │
│ f64 │
╞═════╡
│ 3.0 │
│ 4.0 │
│ NaN │
│ 5.0 │
└─────┘

由于一般不建议使用括号表示法,我们也可以使用 select 来做到这一点:(为了看起来更简洁,我们使用 itertools 中的 compress 函数)

df.select(col for col in df if col.is_not_nan().any())
shape: (4, 1)
┌─────┐
│ b   │
│ --- │
│ f64 │
╞═════╡
│ 3.0 │
│ 4.0 │
│ NaN │
│ 5.0 │
└─────┘
© www.soinside.com 2019 - 2024. All rights reserved.