查看原文
其他

Pandas之分组计算

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:杨长青

本文编辑:杨慧琳

技术总编:张学人

好消息!!!爬虫俱乐部将于2019年5月2日4日在武汉举行Stata编程技术五一训练营,此次采用理论与案例相结合的方式,旨在帮助大家熟悉Stata数据分析技巧,能够通过编程读取不同类型的数据源、实现复杂数据合并、清洗的程序化,并且熟悉Stata核心的爬虫技术。

详细培训大纲及报名方式,请点击文末阅读原文呦~


在数据处理过程,我们经常会用到分组计算。在Stata中,我们可以使用 by 或者 egen 命令,而在Python中如何处理DataFrame数据结构呢?今天我们将介绍Pandas里的两个分组函数 groupby() 以及 apply() 。

我们以auto数据为例,首先执行如下程序:

import pandas as pdauto=pd.read_stata(r"E:\python程序\pandas\auto.dta") #读入dta文件auto.head() #展示前五行

数据集的前五行如下:

如果我们想要按照foreign来计算价格的均值数,可以直接使用 groupby(“foreign”) 进行分组,然后使用 mean() 函数计算中位数,形式如下:

price_m=auto.groupby("foreign")["price"].mean()print(price_m)

输出的是一个series格式的数据:

接下来我们想做的是想要生成一列变量price_m,当属于国产时price_m等于国产车价格的均值;当属于进口时,price_m等于进口车价格的均值。下面我们将price_m使用merge合并到auto数据集(数据集的合并函数merge、join、concat不是本节重点,我们将在之后进行介绍):

auto=auto.merge(price_m,on="foreign") #将price_m并到auto中,按是否进口合并auto.rename(columns={"price_x":"price","price_y":"price_m"},inplace=True) #重命名由于合并auto的price被命名为price_x,price_m被命名为price_yauto.head()

这样,我们便将均值数据与原数据集进行了合并:

以上是对单个变量的分组计算,但面对两个及以上变量时,该如何处理呢?这里只需将列标签设置为列表形式,程序如下:

price_m2=auto.groupby(["mpg","foreign"])["price"].mean()auto=auto.merge(price_m2,on=["foreign","mpg"]) #将price_m2并到auto中,按是否进口合并auto.rename(columns={"price_x":"price","price_y":"price_m2"},inplace=True) #重命名auto.head()

输出结果如下:

爬虫俱乐部是您身边的科研助手,能够为您在数据处理实证研究中提供帮助。承蒙近四万粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,在原有课程基础上已上传了全新的内容!百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:

https://ke.qq.com/course/286526?tuin=1b60b462

敬请关注!


当然上述方法也适用于其他分组情况,除了后接 mean() 求均值,还能接更多的函数:medain()、max()、min()、size()、sd()等。但若想要自定义函数该如何处理呢?这里我们可使用上文提及的 apply() 函数。其定义如下:

DataFrame.applyfunc,axis =0

func:我们定义的函数名。

axis:axis=0表示将函数应用于每列;axis=1表示将函数应用于每行。

倘若我们想实现按foreign分类后,每组组内按顺序排列。如果不使用 apply() 函数,即执行:

auto.groupby('foreign').sort_values('price')

此时出现报错,提醒我们sort_values这个函数不适用于groupby(),我们再次尝试使用 apply() 函数。如下:

def sort(group): group=group.sort_values("price") return group #定义一个排序函数,返回按价格升序后的对象auto.groupby('foreign').apply(sort) #分组后应用排序函数

输出结果也正是我们所需要的:

相比前面介绍的后接函数,apply() 能够保证原数据的前提下把分组后求得的和与原数据合并,就不用像前面一样再使用merge将分组计算的结果并到原数据集中了。比如我们用 apply() 依据foreign分组,再计算均值,则可直接执行如下程序:

def mean(df): df['price_mean'] = df["price"].mean() return df #定义对分组后的对象求均值函数auto.groupby('foreign').apply(mean) #调用mean()函数

输出结果:

这样是不是更加便捷呢?由于 apply() 可依据自身需求定义函数,因此几乎能覆盖分组计算的各类情况。例如,我们按foreign分组,判断各个车型价格是否大于该组的均值,如下:

def fun(df): df['price_mean']=df["price"]>= df["price"].mean() return df auto.groupby('foreign').apply(fun)

最终结果如下:

以上就是 groupby() 和 apply() 在分组计算中的主要用法。大家在学习Pandas的过程中若遇到问题,也欢迎通过邮件与我们探讨。


对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存