假设我有一个
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 的情况下执行此操作?