假设我有一个 csv
transaction_id,user,book
1,bob,bookA
2,bob,bookA
3,bob,bookB
4,tim,bookA
5,lucy,bookA
6,lucy,bookC
7,lucy,bookC
8,lucy,bookC
每个用户,我想找到他们最喜欢的书。例如,输出应该是;
shape: (3, 2)
┌──────┬──────────┐
│ user ┆ fav_book │
│ --- ┆ --- │
│ str ┆ str │
╞══════╪══════════╡
│ bob ┆ bookA │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ tim ┆ bookA │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ lucy ┆ bookC │
└──────┴──────────┘
现在我已经想出了如何做到这一点
import polars as pl
df = pl.read_csv("book_aggs.csv")
print(df)
df2 = df.groupby(["user", "book"]).agg([
pl.col("book").count(),
pl.col("transaction_id") # just so we can double check where it all came from - TODO: how to output this to csv?
])
print(df2)
df3 = df2.sort(["user", "book_count"], reverse=True).groupby("user").agg([
pl.col("book").first().alias("fav_book")
])
print(df3)
但实际上,正常的 sql 方法是按书籍数量降序排序的 dense_rank,其中 rank = 1。我已经尝试了几个小时来让它工作,但我在文档中找不到相关示例。
问题是在文档中,所有 agg 示例都没有引用另一个 agg 的输出 - 在这种情况下,它需要引用每个用户每本书的计数,然后对这些计数进行降序排序,然后根据该排序顺序进行排名。
请提供一个示例来说明如何使用排名来执行此任务,以及如何有效地嵌套聚合。