我可以使用 Polars `or_` 执行按位分组和聚合吗?

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

假设我有一个

auth
字段,它使用位标志来指示权限(例如 bit-0 表示
add
,bit-1 表示
delete
)。

我如何他们在一起?

import polars as pl

df_in = pl.DataFrame(
    {
        "k": ["a", "a", "b", "b", "c"],
        "auth": [1, 3, 1, 0, 0],
    }
)

数据框:

df_in: shape: (5, 2)
┌─────┬──────┐
│ k   ┆ auth │
│ --- ┆ ---  │
│ str ┆ i64  │
╞═════╪══════╡
│ a   ┆ 1    │
│ a   ┆ 3    │
│ b   ┆ 1    │
│ b   ┆ 0    │
│ c   ┆ 0    │
└─────┴──────┘

当我分组并求和时,情况看起来不错,我将

auth
k

求和
dfsum = df_in.group_by("k").agg(pl.col("auth").sum())
dfsum: shape: (3, 2)
┌─────┬──────┐
│ k   ┆ auth │
│ --- ┆ ---  │
│ str ┆ i64  │
╞═════╪══════╡
│ a   ┆ 4    │
│ b   ┆ 1    │
│ c   ┆ 0    │
└─────┴──────┘

所以,在使用

group_by
时,看起来我正确地使用了
agg
sum

使用时不太好

or_

dfor = df_in.group_by("k").agg(pl.col("auth").or_())

给予

dfor: shape: (3, 2)
┌─────┬───────────┐
│ k   ┆ auth      │
│ --- ┆ ---       │
│ str ┆ list[i64] │
╞═════╪═══════════╡
│ a   ┆ [1, 3]    │
│ b   ┆ [1, 0]    │
│ c   ┆ [0]       │
└─────┴───────────┘

期望:

对于

or_
我本来期待这个结果:

df_wanted_or: shape: (3, 2)
┌─────┬──────┐
│ k   ┆ auth │
│ --- ┆ ---  │
│ str ┆ i64  │
╞═════╪══════╡
│ a   ┆ 3    │
│ b   ┆ 1    │
│ c   ┆ 0    │
└─────┴──────┘

现在,我确实找到了一种解决方法,即使用

map_batches
来调用 Python 函数。 非常简单,比如

functools.reduce(lambda x,y: x|y)

但是如何在不离开 Polars 的情况下执行此操作?

aggregate bitwise-operators python-polars
1个回答
0
投票

它看起来还没有在极地中实现 - 问题

目前您可能可以使用 DuckDB 与 Polars 和

bit_or()

集成
duckdb.sql("""
    select
        k,
        bit_or(auth) as auth
    from df_in
    group by
        k
""").pl()
shape: (3, 2)
┌─────┬──────┐
│ k   ┆ auth │
│ --- ┆ ---  │
│ str ┆ i64  │
╞═════╪══════╡
│ a   ┆ 3    │
│ b   ┆ 1    │
│ c   ┆ 0    │
└─────┴──────┘
© www.soinside.com 2019 - 2024. All rights reserved.