将小计添加到 Pandas Groupby

2023-12-01

我正在寻找一种更干净的方法来将小计添加到 Pandas groupby 中。

这是我的数据框:

df = pd.DataFrame({
'Category':np.random.choice( ['Group A','Group B'], 50),
'Sub-Category':np.random.choice( ['X','Y'], 50),
'Product':np.random.choice( ['Product 1','Product 2'], 50),
'Units_Sold':np.random.randint(1,100, size=(50)),
'Dollars_Sold':np.random.randint(100,1000, size=50),
'Date':np.random.choice( pd.date_range('1/1/2011','03/31/2011',  
                      freq='D'), 50, replace=False)})

从那里,我创建一个新的 Groupby Dataframe,如下所示:

df1 = df.groupby(['Category','Sub-Category','Product',pd.TimeGrouper(key='Date',freq='M')]).agg({'Units_Sold':'sum','Dollars_Sold':'sum'}).unstack().fillna(0)

我想提供类别和子类别的小计。我可以使用以下代码来做到这一点:

df2 = df1.groupby(level=[0,1]).sum()
df2.index = pd.MultiIndex.from_arrays([df2.index.get_level_values(0),
                                   df2.index.get_level_values(1) + ' Total',
                                   len(df2) * ['']])
df3 = df1.groupby(level=[0]).sum()
df3.index = pd.MultiIndex.from_arrays([df3.index.get_level_values(0) + ' Total',
                                   len(df3) * [''],
                                   len(df3) * ['']])
pd.concat([df1,df2,df3]).sort_index()

这给了我我想要的数据框:最终数据框

我的问题 - 有没有比为每个级别创建一个新的 DataFrame 然后连接在一起更Pythonic 的方法来做到这一点?我对此进行了研究,但找不到更好的方法。我必须对许多不同的多索引数据帧执行此操作,并且正在寻求更好的解决方案。

在此先感谢您的帮助!

编辑附加信息:

感谢@Wen 和@DaFanat 的回复。我尝试使用我的数据上提供的链接@Wen [链接]:Python(Pandas)在多索引数据帧的每个级别上添加小计

pd.concat([df.assign(\
    **{x: 'Total' for x in "CategorySub-CategoryProduct"[i:]}\
    ).groupby(list('abc')).sum() for i in range(1,4)])\
    .sort_index()

这对总数进行了求和,但它忽略了构成第二级列的日期。它给我留下了这个结果。结果图像

我尝试使用 groupby 添加 TimeGrouper ,但这会返回错误。任何帮助将不胜感激。谢谢!


通过将您上面的尝试与@piRSquared 中的示例对齐,我可以让您更接近。

该列表必须与多重索引匹配。试试这个:

iList = ['Category','Sub-Category','Product']
pd.concat([
    df1.assign(
        **{x: '' for x in iList[i:]}
    ).groupby(iList).sum() for i in range(1,4)
]).sort_index()

它没有在正确的位置显示“总计”一词,也没有在每组的底部显示总计,但至少它在功能上或多或少是正确的。我的总计不匹配,因为 DataFrame 中的值是随机的。

我花了一段时间才完成中提供的原始答案Python(Pandas)在多索引数据帧的每个级别上添加小计。但同样的逻辑也适用于此。

allocate() 将列中的值替换为对 MultiIndex 列列表的元素执行的字典理解所返回的字典中的值。
然后 groupby() 只查找那些非空白列的唯一值并对它们进行相应的求和。
这些 groupby 包含在列表理解中,因此 pd.concat() 只需组合这些行集。
sort_index() 将索引标签按升序排列。
(是的,您仍然会收到有关“列名和索引级别”的警告,但它仍然有效。)

Table with subtotals

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将小计添加到 Pandas Groupby 的相关文章

随机推荐

  • 根据 Google 表格中单列中的重复项删除行

    我有与此类似的电子表格 我想根据第一列数据删除行的所有重复项 因此 在此屏幕截图行中 将保留第 1 行和第 2 行 并删除第 2 行 任何帮助将不胜感激 附 在我的例子中 列从 A 到 AU 行从 2 到 9500 谢谢 Maya s an
  • 如何在同一个循环中同时循环所有 Firebase 子项?

    我在 firebase 中有三个节点 我想使用相同的循环来循环它们 我成功地能够使用以下代码循环遍历单个节点 cookie databaseRef child cookies observeSingleEvent of value with
  • 从 Java 到 PHP 重新创建 PDF 文件

    我有一个 Java 中的 WebService 使用 Apache Axis 它获取文档的 id 并调用 JasperReports 来创建 PDF 文件 之前在 java 应用程序中创建的报告 服务器端 以创建我正在使用的方法的报告 Ja
  • 使用 Javascript 删除从不同页面呈现的整个表格

    我有一张像这样的桌子 table class toc border 1 table 在许多页面中 所有这些页面都呈现在单个页面中 当我应用 Javascript 来删除加载时使用的内容时 仅删除一张表 其他表不会被删除 我正在尝试使用 Ja
  • Azure AD登录后如何重定向到特定页面?

    我正在将 Azure AD 登录集成到我的应用程序中 我想在成功登录天蓝色广告后重定向到特定操作 我的 Startup Auth cs 文件中有以下代码 但它没有重定向到redirecturi 任何人都可以建议我如何在成功登录后重定向到自定
  • Python Tkinter Treeview 添加图像作为列值

    我试图将图像添加到树视图上每一行的第一列 但无论我做什么 最终总是显示对象 pyimage1 的名称而不是实际图像 正如这张图片所示 我正在使用的代码是这样的 from tkinter import PhotoImage self img
  • 如何使用 jQuery 在 30 分钟内使 cookie 过期?

    如何让 Cookie 在 30 分钟内过期 我正在使用 jQuery cookie 我能够做这样的事情 cookie example foo expires 1 这是 1 天的时间 但是我们如何将到期时间设置为 30 分钟 30分钟是30
  • 在 SQL SERVER 2008 中从字符串转换日期和/或时间时转换失败

    我有以下 SQL UPDATE student queues SET Deleted 0 last accessed by raja last accessed on CONVERT VARCHAR 24 23 07 2014 09 37
  • 是否有 C# 中的 JSON Web Token (JWT) 示例?

    我觉得我在这里服用了疯狂的药 通常 对于任何给定的任务 网络上总会有一百万个库和示例 我正在尝试使用 JSON Web Tokens JWT 来实现 Google 服务帐户 的身份验证 如下所述here 但是 只有 PHP Python 和
  • 使用 C#/.NET 将图像上传到服务器并将文件名存储在数据库中

    我目前正在使用以下代码片段将数据插入数据库的表中 效果很好 但是 我想开始添加文件名数据 但不确定如何继续 我有以下内容 Create command comm new SqlCommand INSERT INTO Entries Titl
  • 基于主机的卡模拟,有什么指导吗?

    我是这个领域的新手 我有一个 Nexus S CyanogenMod11 Android Kitkat 4 4 2 我需要使用 HCE 基于主机的卡模拟 模式来模拟非接触式卡 为了实现这一目标 我需要遵循的步骤和技巧有什么指导吗 我需要对模
  • 如何从 hashCode 中获取字符串

    我正在开发一个项目 我得到了我的密码字段值hashCode出于安全目的 并将该 hashCode 存储在数据库中 现在我想从 hashCode 中恢复密码 我该怎么做 是否可以从 hashCode 中获取 String 值 如果不是 任何人
  • 为什么docker build后node_modules为空?

    为什么我的 docker 数据卷在主机系统上挂载为空 当 的时候docker compose up完成后我可以执行到 docker 容器并查看node modules目录中 我可以看到所有已成功安装的模块 但是当我检查我的node modu
  • 有没有办法在 ActionScript 中获取字形的实际边界框?

    我正在学习 ActionScript Flash 我喜欢玩弄文本 并且使用出色的 Java2D API 做了很多这样的事情 我想知道的一件事是 你到底在哪里画那个字形 TextField 类提供了方法getBounds and getCha
  • IE 中的 JQuery 复选框列表问题?保存为 on,on,on 的值应为 10,12,13 等

    我有一个使用 javascript 呈现的复选框列表
  • 开发和生产属性

    我有一个 GlassFish j2ee 应用程序 我在一个盒子上进行开发 生产是一个远程盒子 我有一个生成文件的函数 并且我需要根据我的开发盒或生产情况使文件的位置有所不同 有什么自动方法可以进行切换 这样我就不必根据部署位置来编辑源文件
  • 春季启动+休眠

    我的 Maven 依赖项出了什么问题 当我包含 JPA 时 我有例外列表 这是我的 Maven 依赖项
  • 如何将Hive连接到asp.net项目

    你好 我对 Hadoop 很陌生 我已将 Microsoft HDInsight 安装到本地系统 现在我想连接到 hive 和 HBase 但用于 HIVE 连接 我必须指定连接字符串 端口 用户名 密码 但我无法弄清楚如何获得这个值 我尝
  • Git:在提交/推送之前运行过滤器?

    有没有办法在提交之前通过过滤器运行更改的文件 我希望确保文件遵循项目的编码标准 我还想在提交 推送实际发生之前编译并运行一些测试 所以我知道存储库中的所有内容实际上都有效 预提交挂钩 继续阅读git钩子 Git 书籍有一个example例如
  • 将小计添加到 Pandas Groupby

    我正在寻找一种更干净的方法来将小计添加到 Pandas groupby 中 这是我的数据框 df pd DataFrame Category np random choice Group A Group B 50 Sub Category