AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79244459
Accepted
Simon
Simon
Asked: 2024-12-02 22:33:51 +0800 CST2024-12-02 22:33:51 +0800 CST 2024-12-02 22:33:51 +0800 CST

如何在 Polars DataFrame 中使用聚合函数作为索引?

  • 772

我有一个 Polars DataFrame,我想创建一个汇总视图,其中聚合值(例如唯一 ID、总发送量)以一种便于跨月比较的格式显示。以下是我的数据集示例:

我的示例数据框:

import polars as pl
df = pl.DataFrame({
    "Channel": ["X", "X", "Y", "Y", "X", "X", "Y", "Y", "X", "X", "Y", "Y", "X", "X", "Y", "Y"],
    "ID": ["a", "b", "b", "a", "e", "b", "g", "h", "a", "a", "k", "a", "b", "n", "o", "p"],
    "Month": ["1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2"]
})

目前,我使用以下group_by()方法来计算每个月和每个渠道的唯一 ID 数量和总发送次数:

(
    df
    .group_by(
        pl.col("Month"),
        pl.col("Channel")
    )
    .agg(
        pl.col("ID").n_unique().alias("Uniques ID"),
        pl.col("ID").len().alias("Total sends")
    )
)
shape: (4, 4)
┌───────┬─────────┬────────────┬─────────────┐
│ Month ┆ Channel ┆ Uniques ID ┆ Total sends │
│ ---   ┆ ---     ┆ ---        ┆ ---         │
│ str   ┆ str     ┆ u32        ┆ u32         │
╞═══════╪═════════╪════════════╪═════════════╡
│ 1     ┆ X       ┆ 3          ┆ 4           │
│ 1     ┆ Y       ┆ 4          ┆ 4           │
│ 2     ┆ X       ┆ 3          ┆ 4           │
│ 2     ┆ Y       ┆ 3          ┆ 4           │
└───────┴─────────┴────────────┴─────────────┘

但是,我的实际数据集要大得多,并且具有更多 agg_functions,因此我需要一种能够更好地突出显示跨月比较的格式。理想情况下,我希望输出如下所示:

| Channels | agg_func     | months | months |
|----------|--------------|--------|--------|
|          |              | 1      | 2      |
| X        | Uniques ID   | 3      | 3      |
| X        | Total sends  | 4      | 4      |
| Y        | Uniques ID   | 4      | 3      |
| Y        | Total sends  | 4      | 4      |

我相信我可以使用.pivot()并传递聚合函数作为索引的一部分。但是,我不确定如何在不创建辅助 DataFrame 的情况下直接实现这一点。有什么建议吗?

python
  • 1 1 个回答
  • 43 Views

1 个回答

  • Voted
  1. Best Answer
    roman
    2024-12-02T23:17:20+08:002024-12-02T23:17:20+08:00

    您可以在旋转时聚合多个聚合,然后展开列表:

    (
        df.pivot(
            on="Month",
            values="ID",
            aggregate_function=
            pl.concat_list(
                pl.element().n_unique().alias("value"),
                pl.element().len().alias("value")
            )
        )
        .with_columns(agg_func=["Uniques ID","Total sends"])
        .explode(pl.exclude("Channel"))
    )
    
    shape: (4, 4)
    ┌─────────┬─────┬─────┬─────────────┐
    │ Channel ┆ 1   ┆ 2   ┆ agg_func    │
    │ ---     ┆ --- ┆ --- ┆ ---         │
    │ str     ┆ u32 ┆ u32 ┆ str         │
    ╞═════════╪═════╪═════╪═════════════╡
    │ X       ┆ 3   ┆ 3   ┆ Uniques ID  │
    │ X       ┆ 4   ┆ 4   ┆ Total sends │
    │ Y       ┆ 4   ┆ 3   ┆ Uniques ID  │
    │ Y       ┆ 4   ┆ 4   ┆ Total sends │
    └─────────┴─────┴─────┴─────────────┘
    

    或者,您可以使用多个枢轴(每个聚合函数一个)来完成此操作:

    pl.concat([
        df.pivot(
           on="Month",
           values="ID",
           aggregate_function=agg_func
        ).with_columns(
            pl.lit(agg_func_name).alias("agg_func")
        )
        for agg_func, agg_func_name in [
            (pl.element().n_unique(), "Uniques ID"), 
            (pl.element().len(), "Total sends")
        ]
    ])
    
    # alternatively group_by first and then pivot
    # pl.concat([
    #     df.group_by("Month","Channel")
    #     .agg(agg_func)
    #     .with_columns(agg_func=pl.lit(agg_func_name))
    #     for agg_func, agg_func_name in [
    #         (pl.col.ID.n_unique(), "Uniques ID"), 
    #         (pl.col.ID.len(), "Total sends")
    #     ]
    # ]).pivot(on="Month", values="ID")
    
    shape: (4, 4)
    ┌─────────┬─────┬─────┬─────────────┐
    │ Channel ┆ 1   ┆ 2   ┆ agg_func    │
    │ ---     ┆ --- ┆ --- ┆ ---         │
    │ str     ┆ u32 ┆ u32 ┆ str         │
    ╞═════════╪═════╪═════╪═════════════╡
    │ X       ┆ 3   ┆ 3   ┆ Uniques ID  │
    │ Y       ┆ 4   ┆ 3   ┆ Uniques ID  │
    │ X       ┆ 4   ┆ 4   ┆ Total sends │
    │ Y       ┆ 4   ┆ 4   ┆ Total sends │
    └─────────┴─────┴─────┴─────────────┘
    

    当然,你也可以使用unpivot以下方法扩展你的解决方案:pivot

    (
        df
        .group_by("Month","Channel")
        .agg(
            pl.col("ID").n_unique().alias("Uniques ID"),
            pl.col("ID").len().alias("Total sends")
        )
        .unpivot(index=["Month","Channel"], variable_name="agg_func")
        .pivot(on="Month", values="value")
    )
    
    shape: (4, 4)
    ┌─────────┬─────────────┬─────┬─────┐
    │ Channel ┆ agg_func    ┆ 2   ┆ 1   │
    │ ---     ┆ ---         ┆ --- ┆ --- │
    │ str     ┆ str         ┆ u32 ┆ u32 │
    ╞═════════╪═════════════╪═════╪═════╡
    │ Y       ┆ Uniques ID  ┆ 3   ┆ 4   │
    │ X       ┆ Uniques ID  ┆ 3   ┆ 3   │
    │ Y       ┆ Total sends ┆ 4   ┆ 4   │
    │ X       ┆ Total sends ┆ 4   ┆ 4   │
    └─────────┴─────────────┴─────┴─────┘
    
    • 1

相关问题

  • 如何将 for 循环拆分为 3 个单独的数据框?

  • 如何检查 Pandas DataFrame 中的所有浮点列是否近似相等或接近

  • “load_dataset”如何工作,因为它没有检测示例文件?

  • 为什么 pandas.eval() 字符串比较返回 False

  • Python tkinter/ ttkboostrap dateentry 在只读状态下不起作用

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve