原标题:Pandas之分组计算

本文作者:杨长青

本文编辑:杨慧琳

技术总编:张学人

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

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

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

import pandas aspd

auto=pd.read_stata(r"E:python程序pandasauto.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_y

auto.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()

输出结果如下:

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

DataFrame.apply(func,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")

returngroup#定义一个排序函数,返回按价格升序后的对象

auto.groupby('foreign').apply(sort) #分组后应用排序函数

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

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

defmean(df):

df['price_mean'] = df["price"].mean()

returndf #定义对分组后的对象求均值函数

auto.groupby('foreign').apply(mean) #调用mean()函数

输出结果:

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

def fun(df):

df['price_mean']=df["price"]>= df["price"].mean()

returndf

auto.groupby('foreign').apply(fun)

最终结果如下:

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

关于我们

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

投稿要求:

1)必须原创,禁止抄袭;

2)必须准确,详细,有例子,有截图;

注意事项:

1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。

3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。返回搜狐,查看更多

责任编辑:

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐