200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 如何使用agg函数对数据进行分组聚合

如何使用agg函数对数据进行分组聚合

时间:2019-01-27 16:46:42

相关推荐

如何使用agg函数对数据进行分组聚合

转载自知乎:侦探L如何使用agg函数对数据进行分组聚合 - 知乎

在上篇文章中,我们详细地介绍了如何使用groupby函数对数据进行分组。而在python的数据分组中,除了groupby函数之外,agg函数也是我们使用pandas进行数据分析过程中,针对数据分组常用的一条函数。而今天我们就来介绍一下agg函数的用法。

如果说用groupby进行数据分组,可以看做是基于行(或者说是index)操作的话,则agg函数则是基于列的聚合操作。

从实现上看,groupby返回的是一个DataFrameGroupBy结构,这个结构必须调用聚合函数(如sum)之后,才会得到结构为Series的数据结果。在之前关于groupby函数的使用中,大家应该也看出来了,每次用groupby函数后,都是要接类似sum、mean等聚合函数才能输出。

侦探L:如何使用groupby函数对数据进行分组(1)27 赞同 · 1 评论文章正在上传…重新上传取消

而agg是DataFrame的直接方法,返回的也是一个DataFrame。当然,很多功能用sum、mean等等也可以实现。但是agg更加简洁, 而且传给它的函数可以是字符串,也可以自定义,参数是column对应的子DataFrame。

下面我们举几个例子,让大家对agg函数有更直观的体会。

首先,还是一样先建立我们实验要用的数据表。

cities = pd.DataFrame(np.random.randn(5, 5),index=['a', 'b', 'c', 'd', 'e'],columns=['shenzhen', 'guangzhou', 'beijing', 'nanjing', 'haerbin'])cities.iloc[2:4,2:4] = np.nan cities

可以看到,这是一个列标签为城市名、包含了几个缺失值的数据表。

如果这个时候,我们想看一下按城市分组,然后查看一下各个城市下数据的均值(mean)和总和(sum)呢,应该怎么做呢?

可以有些同学会以下这么做:

好像确实可以这么做,不过如果我们还要再统计个数,中位数这些呢?一个个地打好像可以,但是总觉得十分麻烦。有没有什么更简便的做法呢?答案就是用agg函数

针对我们上面的例子,我们用agg函数再做一次:

cities[['shenzhen','guangzhou','beijing','nanjing','haerbin']].agg(['sum','mean'])

一次完成!是不是简便得多。

与此同时,对于上面的数据表,我们还可以针对不同的城市,使用不同的聚合函数,只要指定一下就好了:

cities.agg({'shenzhen':['sum'],'beijing':['mean'],'nanjing':['sum','mean']})

可以看到,没指定的城市及函数就没有被输出出来~

groupby函数和agg函数的联用

在我们用pandas对数据进行分组聚合的实际操作中,很多时候会同时使用groupby函数和agg函数。下面我们重新建立一个数据表,然后实验一下:

df = pd.DataFrame({'Country':['China','China', 'India', 'India', 'America', 'Japan', 'China', 'India'], 'Income':[10000, 10000, 5000, 5002, 40000, 50000, 8000, 5000],'Age':[50, 43, 34, 40, 25, 25, 45, 32]})df

可以看到在我们的数据表中,有国家(Country)、工资(Income)、年龄(Age)三列数据。

下面我们同时使用groupby和agg函数对该数据表进行分组聚合操作。

df_inc=df.groupby('Country').agg(['min','max','mean'])df_inc

我们从上述结果可以看到,原本的数据表按照“国家(Country)”进行了分组及相应的聚合方式。

有些时候我们只需要对部分数据进行不同的聚合操作,此时就可以通过字典的方式来实现。比如说下面这样:

df_age={'Age':['max','min','mean']}df.groupby('Country').agg(df_age)

在我们对数据进行聚合的过程中,除了使用sum()、max()等系统自带的聚合函数之外,,大家也可以使用自己定义的函数,使用方法也是一样的~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。