groupby后面接两个_Pandas学习笔记(十五):GroupBy研究

前言

在之前我们的实战环节中,曾用到Pandasgroupby函数来统计一些数据,但在使用过程中,还是显得很笨拙,这一篇文章我们来重新认真梳理一下与groupby有关的知识,以便于在数据分析中更好的使用。 groupby的实质是将数据按选定的列进行分类合并后再形成一个大的“数据框架”,但这个新形成的“数据框架”却具备了很多统计功能,下面我们来详细说明。

数据准备

学习Pandas最好的方式即是使用合适的数据,为了更好地研究groupby,我们采用一些订单数据,这些数据从https://github.com/FBosler/Medium-Data-Exploration网站下载,主要下载order_leads.csvsales_team.csv,然后用Pandas读取:

755dba48043e276286297bd24d8b77da.png

由于两个数据框架都有 Company NameCompany Id 列,为了处理数据方便起见,将上面两个数据集进行合并:

b938664b562f152778cbdff75af6ea20.png

为了对上述数据的列名称方便引用,现将其列名称修改如下:

0f72bacf4c2448d2d7eafb8e0b1d0ed9.png

至此,数据准备完毕。

销售人员分类统计

为了对销售人员的销售记录进行统计,需要将上述数据按销售人员进行分组:

9f388b5c1822fa092d4c3650f2dc92e1.png

从上述输出来看, groupby 返回的是一个 DataFrameGroupBy 对象,在之前我们有提到过,所谓的 groupby 其实就是对某一特定的列分类汇总,如果想看一下刚创建的这个对象中的群组分类,则只需要输入 salespp.groups 即可,显示截图如下:

601f2b6a42067b890096b28dc1142d4d.png

我们来选择分类群组中的一个特定的人,比如上面的 William Taylor ,可以这样来查询:

e28f1899c77e8d680504ce21c3e3316c.png

从上面可以看出,名叫 William Taylor 的这个人一共有 282 条记录。 现在我们来查看一下这个群组中各人的销售记录总数:

541e89337cb215bb564504c86da22388.png

从上述结果可以看出,一共有 499 个人,他们每个人的记录都被汇总在其名字后面。 注意: 这一点就比我们之前实战时所用的方法要好得多,当时我们是这样子处理的:

2727d4cb60991f161319d8902097bfc3.png

如果我们想按这些销售人员名字的第一部分来进行统计,也是可以的,对于中国人姓名而言,相当于只对其 名字 进行统计,方法如下:

4e7480b456c94ee24f70f2ac296030f2.png

从这个统计与上一个统计相比,可发现,在按名字第一部分进行统计的时候,将名字一样的人进行了合并。 如果我们只想查找叫William的人的销售记录,可以这样:

b1f1be412147f55b9cfc794e8165b0b8.png

由此可见,这个统计是将所有名为 William 的人的名字所销售的记录合在一起了。

将销售额进行分类

在之前介绍itertools模块的文章中,我们介绍过可以应用它里面的groupby函数来对数据进行分类,这需要自定义函数。其实在Pandas中的groupby功能也是相当强大,它甚至可以自动进行分类,比如现在我们将上述数据集中订单价值自动分为高、中、低三个档次,可以这样表示:

88e94143c22f322a2772b6578684e0fa.png

如果想得到和 itertools 中的 groupby 输出相同,可以用 .groups 属性来得到。 当然,我们可以不用pd.qcut来自动分类,可以自定义分组的大小,比如:

bf41f601a62f9fafd80fc8bc37c97e40.png

按时间分组 如果按之前我的方法,比如要对上述数据中按来汇总的话,是这样处理的:

614a6feac2ce971fb3aa87348d3160f0.png

Pandas 中,其实还有一种方法,它用到了 pd.Grouper 函数:

316e134f7cfb90ea83aa9896c1141fb8.png

从代码组成来看,第二种方法会感觉更好一点,这里可以做统计周期的参数分别是 YMDWQ ,它们分别对应 年、月、日、星期、季 ,如果我们按 来统计,则代码如下:

4006b507364dc23a0b72b07556186587.png

按多列的分类汇总与上述相差不多,只不过要注意,当有多个列时,需要将多个列用 [] 括起来作为一个参数。

高级应用

下面我们来研究经常和groupby相关联的四个函数,这四个函数非常重要,掌握了它们,基本上就掌握了groupby的高级用法。 apply 下面我们来对销售量进行求和,这里用的是apply函数:

8e6e82f7e5f81f4ae6fe9018ea2b336d.png

如果对两个量分别进行求和,则可以这样:

684abd8a81b270242d475851b9eb6fd0.png

agg 这是聚合函数,它是aggregate的缩写形式,该函数一般结合求和、求平均或计数等函数一起使用,演示如下:

00c4f9bdb52b51a97b266199c41b4cc1.png

transform 在计算某列值中的每一个占整列和的百分比时,transform就派上了用场:

80c1fba90231902563163d0f1fb56723.png

注意,上述代码中的 transform 也可以用 apply 代替:

cc5f2343e760b34ee0c11eff58efd42a.png

filter 在过滤一些值时我们考虑使用filter,比如要查看销售量乘以订单价值大于300000的销售人员,可以这样:

26c28435afd40a6df9d05ee859a4032a.png

在这种情况下,无法用 apply 替代 filter ,再来看一下人均销售量大于 0.3 的人:

032fa7e9438e581811b112cff4820ef0.png

小结 本文对Pandasgroupby函数进行了详细举例说明,熟练掌握分类汇总,对于我们的日常工作将有极大助益。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值