python Polars和Lazy API:如何删除只包含空值的列?

cwxwcias  于 2023-05-27  发布在  Python
关注(0)|答案(1)|浏览(260)

我正在使用Polars,需要在数据预处理过程中删除仅包含空值的列。但是,我在使用Lazy API来实现这一点时遇到了麻烦。
例如,给定下表,我如何使用Polars的Lazy API删除列“a”?

df = pl.DataFrame(
    {
        "a": [None, None, None, None],
        "b": [1, 2, None, 1],
        "c": [1, None, None, 1],
    }
)
df
shape: (4, 3)
┌──────┬──────┬──────┐
│ a    ┆ b    ┆ c    │
│ ---  ┆ ---  ┆ ---  │
│ f64  ┆ i64  ┆ i64  │
╞══════╪══════╪══════╡
│ null ┆ 1    ┆ 1    │
├╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ null ┆ 2    ┆ null │
├╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ null ┆ null ┆ null │
├╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ null ┆ 1    ┆ 1    │
└──────┴──────┴──────┘

我知道Issue #1613和过滤所有值都为空的列的解决方案,但这不是Lazy API。
仅供参考

# filter columns where all values are null
df[:, [not (s.null_count() == df.height) for s in df]]

我还知道Polars中的drop_nulls函数,它只能删除所有包含空值的行,不像Pandas中的dropna函数可以接受两个参数axishow。有人能提供一个例子,说明如何使用Lazy API删除Polars中所有空值的列吗?

hlswsv35

hlswsv351#

你不能,至少不是以你想要的方式。polars对lazyframe的了解不够,不知道哪些列是空值,直到你collect。这意味着你需要一个collect来获得你想要的列,然后再用另一个collect来具体化你想要的列。
把你的df=df.lazy()
第一步:

(df.select(pl.all().is_null().all())
    .melt()
    .filter(pl.col('value')==False)
    .select('variable')
    .collect()
    .to_series()
    .to_list())

这些列没有空值,所以现在将其 Package 在自己的select中
第二步:

(df.select(
    df.select(pl.all().is_null().all())
        .melt()
        .filter(pl.col('value')==False)
        .select('variable')
        .collect()
        .to_series()
        .to_list())
.collect())

相关问题