前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas每天一题-题目9:计算平均收入的多种方式

pandas每天一题-题目9:计算平均收入的多种方式

作者头像
咋咋
发布2021-09-01 14:21:59
1.1K0
发布2021-09-01 14:21:59
举报
文章被收录于专栏:数据大宇宙

这是一个关于 pandas 从基础到进阶的练习题系列,来源于 github 上的 guipsamora/pandas_exercises 。这个项目从基础到进阶,可以检验你有多么了解 pandas。

我会挑选一些题目,并且提供比原题库更多的解决方法以及更详尽的解析

计划每天更新一期,希望各位小伙伴先自行思考,再查看答案。如果对你有帮助,记得转发推荐给你的好友!

上期文章:pandas每天一题-题目8:去重计数的多种实现方式

后台回复"数据",可以下载本题数据集

如下数据:

数据描述:

  • 此数据是订单明细表。一个订单会包含很多明细项,表中每个样本(每一行)表示一个明细项
  • order_id 列存在重复
  • quantity 是明细项数量

需求:计算订单平均收入?

说明:

假如有10笔订单,总收入(quantity * item_price)是200,那么订单平均收入 = 200/10=20

虽然需求很简单,但有些实现方式考验你的 groupby 理解程度!

下面是答案了


方式1

初学者容易给出的错误答案是:

代码语言:javascript
复制
df = pd.read_csv('chipotle.tsv',sep='\t',converters={'item_price': lambda x: float(x[1:-1])})
df.eval('quantity * item_price').mean()
  • 这个结果实际是"订单明细平均收入"

问题在于数据颗粒度不是一个订单,而是一个订单中的明细项。

因此第一种方式就是调整颗粒度:

代码语言:javascript
复制
(
    df.groupby('order_id')
    .apply(
        lambda g: g.eval('quantity * item_price').sum()
    )
    .mean()
)
代码语言:javascript
复制
21.394231188658654
  • 行2:把细颗粒度转粗颗粒度,汇总是最直接。按 order_id 分组即可
  • 行3:由于收入需要计算,因此使用 apply 可以充分控制每一组汇总的细节
  • 行4:参数 g 就是每个 order_id 的组,是一个表(DataFrame),这里是计算总收入
  • 行6:上一步的结果是一个表,颗粒度是每个订单的收入。因此,直接求平均即可

使用 groupby+ apply 比较慢,我们可以把计算收入放在分组之前:

代码语言:javascript
复制
(
    df.eval('revenue=quantity * item_price')
    .groupby('order_id')
    .agg({'revenue':sum})['revenue']
    .mean()
)
  • 行2:df.eval 可以直接表达新增列逻辑
  • 行4:由于汇总逻辑更直接,不需要用apply ,可以直接用 agg。对 revenue 求和
  • 但是 groupby + agg 出来的结果是一个表,如果直接求平均,会得到一个列(遍历所有列求平均)。因此这里需要取出 revenue 列

有没有发现,收入只是一个临时变量,但代码中却多次出现(revenue)。可否省略?这引出方式2


方式2

pandas允许直接对列(Series)做分组:

代码语言:javascript
复制
(
    df.eval('quantity * item_price')
    .groupby(df.order_id)
    .sum()
    .mean()
)
  • 行2:直接计算收入,此时得到的是列(Series)
  • 行3:对列分组,但是列里面没有分组依据(order_id),我们可以直接把数据传入。注意这里不是列名(字符串),而是一列数据
  • 行4:这里的 sum 是 groupby 后的操作,表达的是每一组的统计方式,我们需要求总订单收入
  • 行5:上一步得到每个订单的收入,仍然是列(Series),直接求平均,就能得到一个数值

点评:

  1. 这种方式最直观,无须中间变量

推荐阅读:

  1. 懂Excel轻松入门Python数据分析包pandas(29):轻松做出筛选控件
  2. 懂Excel轻松入门Python数据分析包pandas(二十八):二分法查找
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方式1
  • 方式2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档