【Python】pandas 如何实现 excel 中的汇总行?

最近群里小伙伴提出了几个问题,如何用pandas实现execl中的汇总行。

关于这个问题,群里展开了激烈的讨论,最终经过梳理总结出了以下两个解决方法。一种是当做透视时直接使用参数margins,另一种是当无透视时手动造出汇总行。

以下是两种方法的案例,已经收集到了padnas进阶百题库👇中。完整手册可以戳pandas进阶题库了解获取。

pivot_table

问题(群成员"浮生如梦"):

我想统计一月到十二月的所有数据应该怎么写呢?

解决方法

  • 用法:sum()pivot_table

如果要对数据按行方向求和,直接使用sum()函数即可,设置参数axis=1(默认是axis=0列方向对列数据求和),然后将横向求和结果赋给一个新的字段。此例中为求和,其他统计方式如mean、max、min等均同理。

# 生成测试数据
df = pd.DataFrame(np.random.randint(10,100,(9,12)),
                  columns=['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'])
# 横向求和
df['total'] = df.sum(axis=1)

此时已得到行方向的求和,如果我们想继续计算列方向求和并显示出来如何操作呢?可以借助pivot_table来实现,设置参数margins=True

pd.pivot_table(df, index=df.index, aggfunc='sum', margins=True)

groupby+concat

问题(群成员"张晶"):

pandas里面如何实现类似excel中的汇总行?

kv = {'Name': {0'John'1'Mack'2'Lilei'3'Kevin'4'Alin'5'Bob'},
 'Team': {0'A'1'A'2'B'3'B'4'C'5'C'},
 'Jan': {0919283104759},
 'Feb': {0101728374658},
 'Mar': {081927384857},
 'Apri': {081726374658}}
df = pd.DataFrame(kv)

解决方法

用法:groupbyconcatsumtransform

该方法通过几种用法的组合间接实现了行和列数据汇总。

  • 对列数据的汇总求和比较取巧,使用groupby实现了对整列数据求和,求和sum函数中需设置numeric_only参数,只对数值求和。得到列汇总结果后将其与原数据进行concat纵向拼接。

  • 对行数据求和可以直接使用sum函数,通过axis=1指定横向求和。

# 增加列汇总数据
total = df.groupby(lambda _: '总计').sum(numeric_only=True)
# 与原数据纵向拼接
df_total = pd.concat([df,total]).fillna('/')
# 对原数据数值类型横向求和
df_total['total'] = df_total.sum(numeric_only=True,axis=1)
df_total

如果想要对Team进行分组求和,可以通过transform实现组合求和并添加为一个新的求和列。

# 分组内求和
df_total['team_total'] = df_total.groupby(['Team'])['total'].transform('sum')
df_total

以上是本次分享内容。

如果对想加入交流群一起讨论问题,并且拥有pandas入门、进阶、刷题三大图文的永久学习权限,可以戳👉《pandas进阶宝典》详细了解。

- end -
往期精彩回顾



  • 交流群

欢迎加入机器学习爱好者微信群一起和同行交流,目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群,请扫描下面的二维码加群,备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“。请勿在群内发送广告,否则会请出群,谢谢理解~(也可以加入机器学习交流qq群772479961


相关推荐

  • 【学术相关】饶毅:北大老师的博士学位来自什么大学?
  • 【深度学习】既然英伟达A100/H100 太贵,为什么不用 4090?
  • 1024程序员节,有人收获24K黄金键盘帽,也有人收获一包BUG
  • 面试官让列举 Spring 的事务会失效的场景,我说了 8 个
  • AI新突破:提示词生成工具打造Agent,模拟人生
  • 背调电话打给了我撕破脸的前同事,新工作飞了
  • 使用Python分析瑞幸和星巴克全国门店分布关系
  • 一个不太好用的 IDEA 代码生成插件
  • 区区几行Python代码,自动探索性数据分析!
  • 实践教程|scikit-learn 的建模万能模板
  • 看完稚晖君的最新工作台,我酸了。。
  • 技术人对抗焦虑的加减法
  • 大厂面试必考:多线程
  • 聊一聊 React 和 Vue 有啥不一样
  • 【HBLOG10月内推】让你的职业生涯腾飞!
  • 从原理到实践,分析 Redisson 分布式锁的实现方案
  • Java 中的 Stream 可以替代 for 循环吗?
  • 干掉 powerdesigner,设计数据库表用它就够了!
  • 大多数公司,都对 AGPL 许可证“敬而远之”
  • 保护生产中 Node.js 应用程序安全的 15 项最佳实践