代码之家  ›  专栏  ›  技术社区  ›  Andi

根据polars DataFrame计算组中正行的百分比

  •  2
  • Andi  · 技术社区  · 1 年前

    我需要计算正值在 value 按以下方式分组的列 group 列。

    import polars as pl
    
    df = pl.DataFrame(
        {
            "group": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"],
            "value": [2, -1, 3, 1, -2, 1, 2, -1, 3, 2],
        }
    )
    
    shape: (10, 2)
    ┌───────┬───────┐
    │ group ┆ value │
    │ ---   ┆ ---   │
    │ str   ┆ i64   │
    ╞═══════╪═══════╡
    │ A     ┆ 2     │
    │ A     ┆ -1    │
    │ A     ┆ 3     │
    │ A     ┆ 1     │
    │ A     ┆ -2    │
    │ B     ┆ 1     │
    │ B     ┆ 2     │
    │ B     ┆ -1    │
    │ B     ┆ 3     │
    │ B     ┆ 2     │
    └───────┴───────┘
    

    组内 A 5个正值中有3个(60%),而在列中 B 5个正值中有4个(80%)。

    这是预期的数据帧。

    ┌────────┬──────────────────┐
    │ group  ┆ positive_percent │
    │ ---    ┆ ---              │
    │ str    ┆ f64              │
    ╞════════╪══════════════════╡
    │ A      ┆ 0.6              │
    │ B      ┆ 0.8              │
    └────────┴──────────────────┘
    
    2 回复  |  直到 1 年前
        1
  •  2
  •   mozway    1 年前

    你可以使用自定义 group_by.agg 具有 Expr.ge Expr.mean 。这将把值转换为 False / True 根据符号,然后计算 没错 通过采取 mean :

    df.group_by('group').agg(positive_percent=pl.col('value').ge(0).mean())
    

    输出:

    ┌───────┬──────────────────┐
    │ group ┆ positive_percent │
    │ ---   ┆ ---              │
    │ str   ┆ f64              │
    ╞═══════╪══════════════════╡
    │ A     ┆ 0.6              │
    │ B     ┆ 0.8              │
    └───────┴──────────────────┘
    

    中间体:

    ┌───────┬───────┬───────┬──────┐
    │ group ┆ value ┆ ge(0) ┆ mean │
    │ ---   ┆ ---   ┆ ---   ┆ ---  │
    │ str   ┆ i64   ┆ bool  ┆ f64  │
    ╞═══════╪═══════╪═══════╪══════╡
    │ A     ┆ 2     ┆ true  ┆ 0.6  │ #
    │ A     ┆ -1    ┆ false ┆ 0.6  │ # group A
    │ A     ┆ 3     ┆ true  ┆ 0.6  │ # (True+False+True+True+False)/5
    │ A     ┆ 1     ┆ true  ┆ 0.6  │ # = 3/5 = 0.6
    │ A     ┆ -2    ┆ false ┆ 0.6  │ #
    │ B     ┆ 1     ┆ true  ┆ 0.8  │
    │ B     ┆ 2     ┆ true  ┆ 0.8  │
    │ B     ┆ -1    ┆ false ┆ 0.8  │
    │ B     ┆ 3     ┆ true  ┆ 0.8  │
    │ B     ┆ 2     ┆ true  ┆ 0.8  │
    └───────┴───────┴───────┴──────┘
    
        2
  •  1
  •   roman    1 年前

    本质上,你想转换你的 value 列为 True 1 对于积极/ False 0 为负数,然后计算百分比。

    df.group_by("group").agg(
        positive_percent = (pl.all() > 0).sum() / pl.len()
    )
    
    shape: (2, 2)
    ┌───────┬───────┐
    │ group ┆ value │
    │ ---   ┆ ---   │
    │ str   ┆ f64   │
    ╞═══════╪═══════╡
    │ B     ┆ 0.8   │
    │ A     ┆ 0.6   │
    └───────┴───────┘
    

    或者,您可以过滤掉条件不为真的所有行:

    df.group_by("group").agg(
        pl.col.value.filter(pl.col.value > 0).count() / pl.len()
    )