0
  • Q1:在 polars-rust 中,当你这样做时 gourpby.agg,我们可以head(10)用来获取 col 中的前 10 个元素。但是,如果组的长度不同,并且我需要获取20%每个组中的第一个元素,例如 120 个元素组中的 0-24 个元素。如何使它工作?

  • Q2:使用如下数据框示例,我的目标是循环数据框。因为 polars 是主要列,所以我将 df 向下转换为 serval ChunkedArrays 并通过 iter().zip() 进行迭代。我发现它比 goupby(col("date")) 之后的相同操作更快,它是循环一些列表元素。那个怎么样?在我看来,在 groupby 之后 df 的长度更短,这意味着更短的循环。

日期 库存 价格
2010-01-01 IBM 1000
2010-01-02 IBM 1001
2010-01-03 IBM 1002
2010-01-01 苹果 2900
2010-01-02 苹果 2901
2010-01-03 苹果 2902
4

1 回答 1

0

我真的不明白你的第二个问题。也许你可以用一个小例子来创建另一个问题。

我将回答第一个问题:

我们可以使用 head(10) 来获取 col 中的前 10 个元素。但是,如果组的长度不同,我需要在每个组中获取前 20% 的元素,例如 120 个元素组中的 0-24 个元素。如何使它工作?

我们可以使用表达式来取head(n)where n = 0.2 group_size

df = pl.DataFrame({
    "groups": ["a"] * 10 + ["b"] * 20,
    "values": range(30)
})

(df.groupby("groups")
    .agg(pl.all().head(pl.count() * 0.2))
    .explode(pl.all().exclude("groups"))
)

输出:

shape: (6, 2)
┌────────┬────────┐
│ groups ┆ values │
│ ---    ┆ ---    │
│ str    ┆ i64    │
╞════════╪════════╡
│ a      ┆ 0      │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ a      ┆ 1      │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ b      ┆ 10     │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ b      ┆ 11     │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ b      ┆ 12     │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ b      ┆ 13     │
└────────┴────────┘

于 2022-02-27T18:59:31.387 回答