我有一个很大的DF(60M行),我需要进行一些分组和聚合

这是一个与我的数据类似的示例

dic = {
      'Attr1' : ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C'],
      'Attr2' : ['X', 'X', 'Y', 'Y', 'X', 'X', 'Y', 'Y', 'X', 'X', 'Y', 'Y'],
      'Val1' : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
    }
df = pl.DataFrame(dic)
df
shape: (12, 3)
┌───────┬───────┬──────┐
│ Attr1 ┆ Attr2 ┆ Val1 │
│ ---   ┆ ---   ┆ ---  │
│ str   ┆ str   ┆ i64  │
╞═══════╪═══════╪══════╡
│ A     ┆ X     ┆ 1    │
│ A     ┆ X     ┆ 2    │
│ A     ┆ Y     ┆ 3    │
│ A     ┆ Y     ┆ 4    │
│ …     ┆ …     ┆ …    │
│ C     ┆ X     ┆ 9    │
│ C     ┆ X     ┆ 10   │
│ C     ┆ Y     ┆ 11   │
│ C     ┆ Y     ┆ 12   │
└───────┴───────┴──────┘

我正在try 使用每个Attr1和Attr2的分组来获取每个Attr1的最大值

df.group_by(
    ['Attr1' , 'Attr2'], maintain_order=True
    ).agg(
        pl.col('Attr1').count().alias('count'),
        pl.col('Val1').max().alias('MAX')
        )
shape: (6, 4)
┌───────┬───────┬───────┬─────┐
│ Attr1 ┆ Attr2 ┆ count ┆ MAX │
│ ---   ┆ ---   ┆ ---   ┆ --- │
│ str   ┆ str   ┆ u32   ┆ i64 │
╞═══════╪═══════╪═══════╪═════╡
│ A     ┆ X     ┆ 2     ┆ 2   │
│ A     ┆ Y     ┆ 2     ┆ 4   │
│ B     ┆ X     ┆ 2     ┆ 6   │
│ B     ┆ Y     ┆ 2     ┆ 8   │
│ C     ┆ X     ┆ 2     ┆ 10  │
│ C     ┆ Y     ┆ 2     ┆ 12  │
└───────┴───────┴───────┴─────┘

但我需要获得以下输出

shape: (6, 4)
┌───────┬───────┬───────┬─────┐
│ Attr1 ┆ Attr2 ┆ count ┆ MAX │
│ ---   ┆ ---   ┆ ---   ┆ --- │
│ str   ┆ str   ┆ u32   ┆ i64 │
╞═══════╪═══════╪═══════╪═════╡
│ A     ┆ X     ┆ 2     ┆ 4   │
│ A     ┆ Y     ┆ 2     ┆ 4   │
│ B     ┆ X     ┆ 2     ┆ 8   │
│ B     ┆ Y     ┆ 2     ┆ 8   │
│ C     ┆ X     ┆ 2     ┆ 12  │
│ C     ┆ Y     ┆ 2     ┆ 12  │
└───────┴───────┴───────┴─────┘

我可以将DF分成两个DF,然后分组,然后合并,但我正在寻找最佳的优化解决方案,以实现高性能和低内存成本.

提前谢谢你

推荐答案

我认为您正在寻找的是"Window functions",您可以用它来聚合并获得原始数据帧的结果.

(
    df
    .group_by(["Attr1", "Attr2"], maintain_order=True)
    .agg(
        pl.col("Attr1").count().alias("count"), 
        pl.col("Val1").max().alias("MAX")
        )
    .with_columns(
        pl.col("MAX").max().over("Attr1")
        )
    )



 shape: (6, 4)
┌───────┬───────┬───────┬─────┐
│ Attr1 ┆ Attr2 ┆ count ┆ MAX │
│ ---   ┆ ---   ┆ ---   ┆ --- │
│ str   ┆ str   ┆ u32   ┆ i64 │
╞═══════╪═══════╪═══════╪═════╡
│ A     ┆ X     ┆ 2     ┆ 4   │
│ A     ┆ Y     ┆ 2     ┆ 4   │
│ B     ┆ X     ┆ 2     ┆ 8   │
│ B     ┆ Y     ┆ 2     ┆ 8   │
│ C     ┆ X     ┆ 2     ┆ 12  │
│ C     ┆ Y     ┆ 2     ┆ 12  │
└───────┴───────┴───────┴─────┘

Python相关问答推荐

自动编码器和极坐标

使用Python C API重新启动Python解释器

Tkinter -控制调色板的位置

机器人与Pyton Minecraft服务器状态不和

Python panda拆分列保持连续多行

Python -Polars库中的滚动索引?

在Python和matlab中显示不同 colored颜色 的图像

如何根据另一列值用字典中的值替换列值

在内部列表上滚动窗口

如何计算两极打印机中 * 所有列 * 的出现次数?

根据不同列的值在收件箱中移动数据

将jit与numpy linSpace函数一起使用时出错

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

如何根据参数推断对象的返回类型?

在线条上绘制表面

当递归函数的返回值未绑定到变量时,非局部变量不更新:

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

旋转多边形而不改变内部空间关系

使用BeautifulSoup抓取所有链接

为什么'if x is None:pass'比'x is None'单独使用更快?