平时聚合都是求和,计数等
apply如何应用在聚合函数上边?
import pandas as pdposition = pd.read_csv('position.csv')company = pd.read_csv('company_sql.csv',encoding='gbk')# 不同城市下面薪资排名前五的职位# position.groupby('city') 对城市分组之后,每个城市都会对应一个数据框# position.groupby('city').count() 对城市进行分组后计数# apply运用在分组之后,会对形式进行一个小变化,又把分开的数据框合并到了一起def func(x):r = x.sort_values('avg',ascending=False)return r[:5]position.groupby('city').apply(func)# ascending=False降序;反之升序position.sort_values('avg',ascending=False)[0:5]# 根据参数返回行数# 比如:变成升序,返回n行(n可取3,4,5等)# func(x,n,asc=False),func里面可设置asc=False为默认参数def func(x,n,asc=False):r = x.sort_values('avg',ascending = asc)return r[:n]# r[:n]这里原本返回一行的,变成了返回n行# 但是agg里面只能返回一行,如果将自定义函数func应用到agg里面,则会报错# apply(func,n=3,asc=True)里面可改变设置的默认参数ascposition.groupby('city').apply(func,n=3,asc=True)
agg与apply的区别:
(1)agg对聚合后的结果进行函数运用,不涉及形状变换,最后返回一行结果
(2)apply不管数据框之前什么样子,拆分 → 自定义函数筛选 → 整合
# apply和agg相比,apply的灵活性更高# 分组之后求和:position.groupby('city').agg(sum)# 分组之后求平均:position.groupby('city').agg('mean') = position.groupby('city').mean()position.groupby('city').mean()# agg也有一些高级的用法,可以同时运用多个函数position.groupby('city').agg(['sum','mean'])# agg使用自定义函数也可以(不涉及形状变换,最后返回一行结果)position.groupby('city').agg(lambda x:max(x)-min(x))
