groupby().apply()
需求1:按城市分组,找出每个城市薪资排在前5名的数据
- 若直接用gourpby(‘city’).sort_values(‘salary’,ascending=False)[0:5]会报错 ```python df.groupby(‘city’).sort_values(‘salary’,ascending=False)[0:5]
AttributeError: Cannot access callable attribute ‘sort_values’ of ‘DataFrameGroupBy’ objects, try using the ‘apply’ method
- 使用apply函数+groupby
```python
def fun(x):
r = x.sort_values('salary',ascending=False)
return r[:5]
df.groupby('city').apply(fun)
city companyFullName companyId companyLabelList companyShortName companySize businessZones firstType secondType education industryField positionId positionAdvantage positionName positionLables workYear salary top
city
上海 6823 上海 上海遇志投资管理有限公司 151989 ['年底双薪', '股票期权', '创业氛围', '专项奖金'] 复星金服 2000人以上 ['漕河泾'] 技术 管理岗 硕士 金融,移动互联网 2475927 复兴集团背景 强大资源投入 发挥空间巨大 数据技术总监 ['技术总监', '数据'] 5-10年 50 100
6822 上海 上海友希数码科技发展有限公司 150849 ['年底双薪', '专项奖金', '年终分红', '带薪年假'] 友希科技 500-2000人 ['张江'] 开发/测试/运维类 数据开发 本科 硬件 2568751 VR,微鲸科技,阿里腾讯,行业领先 大数据架构师(阿里/腾讯/华人文化共同投资) ['专家', '架构师', '大数据', '数据'] 5-10年 50 100
6759 上海 上海点荣金融信息服务有限责任公司 23177 ['节日礼物', '带薪年假', '岗位晋升', '扁平管理'] 点融网 500-2000人 NaN 技术 高端技术职位 硕士 金融 2323742 海量数据挖掘、建模 资深大数据科学家-SH2914 ['大数据', '数据'] 5-10年 40 60
6757 上海 上海来闪推信息科技有限公司 142712 NaN 来闪推 15-50人 ['陆家嘴', '塘桥', '花木'] 技术 运维安全 本科 移动互联网,O2O 2519292 丰厚的奖金 数据仓库/大数据运维工程师 ['数据仓库', '大数据', '运维', '数据'] 3-5年 40 60
6616 上海 上海银橙文化传媒股份有限公司 62777 ['年底双薪', '节日礼物', '技能培训', '绩效奖金'] 银橙传媒 150-500人 ['漕宝路', '田林', '漕河泾'] 技术 后端开发 本科 移动互联网,数据服务 1145222 工作氛围佳;优秀团队;公司发展前景好 大数据系统架构师 ['大数据', '架构师', '数据', '系统'] 3-5年 40 50
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
长沙 3445 长沙 天闻数媒科技(北京)有限公司 95484 ['专项奖金', '绩效奖金', '岗位晋升', '领导好'] 天闻数媒 150-500人 ['洞井铺'] 技术 后端开发 本科 教育,文化娱乐 2182674 弹性工作 大数据开发工程师 ['大数据', '数据库', '数据'] 3-5年 10 20
2166 长沙 北京炬鑫网络科技有限公司 101239 ['节日礼物', '股票期权', '绩效奖金', '年度旅游'] 北京炬鑫 50-150人 NaN 产品/需求/项目类 数据分析 不限 移动互联网,社交网络 2576001 高薪,福利待遇佳 大数据研究经理 ['大数据', '数据'] 1-3年 10 15
3444 长沙 益丰大药房连锁股份有限公司 6628 ['年底双薪', '绩效奖金', '五险一金', '免费午餐'] 益丰大药房 2000人以上 NaN 市场与销售 市场/营销 本科 电子商务,医疗健康 2316232 上市公司包吃包住五险一金周末双休年终双薪 统计分析师 ['分析师'] 1-3年 10 20
2170 长沙 国防科技大学自动化研究所 84817 NaN 自动化所 150-500人 ['德雅村', '三一大道', '四方坪'] 技术 后端开发 不限 数据服务,企业服务 1903363 成长空间大、团队氛围好! 数据应用开发工程师 ['数据'] 不限 10 15
2637 长沙 长沙网舜科技有限公司 66137 ['年底双薪', '节日礼物', '技能培训', '绩效奖金'] 网舜科技 50-150人 ['麓谷', '麓谷锦园', '汽车西站'] 技术 DBA 大专 移动互联网,电子商务 1708654 带薪年假 年底双薪 包吃住 五险一金 DBA数据分析师 ['分析师', '数据分析', '数据库', 'DBA', '数据'] 3-5年 9 18
需求2:按城市分组,每个城市salary排在最前面的n组数据
#在需求1的基础上增加参数n
def fun(x,n):
r = x.sort_values('salary',ascending=False)
return r[:n]
df.groupby('city').apply(fun,n=2)
需求3:按城市分组,每个城市salary排在最前面或最后面的n组数据
#在需求2的基础上,增加参数asc,默认值是False
def fun(x,n,asc=False):
r = x.sort_values('salary',ascending=asc)
return r[:n]
df.groupby('city').apply(fun,n=2,asc=True)#asc=True表示升序,返回每个城市的salary最低的2组数据
groupby().agg()
agg是aggregate(总计,合计)的简写。
agg()与apply()区别:
- agg是聚合函数,计算出总值,行的总数是一定的;apply相对更灵活一些。
- agg可以同时调用多个函数
举例:
agg调用多个函数
#agg调用多个函数
df[['city','salary','top']].groupby('city').agg(['max','min','mean'])
salary top
max min mean max min mean
city
上海 50 1 12.846939 100 2 21.724490
北京 60 1 13.643832 100 2 23.552575
南京 20 1 8.036145 30 2 13.867470
厦门 20 3 7.700000 30 4 14.233333
天津 15 2 6.300000 20 4 10.200000
广州 30 1 9.397015 60 2 16.008955
成都 50 1 9.474074 80 2 16.222222
杭州 40 2 11.874693 80 3 20.997543
武汉 20 1 8.101449 35 2 14.492754
深圳 50 1 12.825427 100 2 22.356736
苏州 25 3 10.594595 40 5 18.513514
西安 30 2 7.431373 40 3 12.686275
长沙 10 2 6.960000 20 3 12.240000
agg+lambda函数,注意lambda定义的必须是聚合函数 ```python
agg+lambda函数,注意lambda定义的必须是聚合函数
df[[‘city’,’salary’,’top’]].groupby(‘city’).agg(lambda x:max(x)*min(x))
salary top city
上海 50 200 北京 60 200 南京 20 60 厦门 60 120 天津 30 80 广州 30 120 成都 50 160 杭州 80 240 武汉 20 70 深圳 50 200 苏州 75 200 西安 60 120 长沙 20 60
若lambda不是聚合函数,则会报错
df[[‘city’,’salary’,’top’]].groupby(‘city’).agg(lambda x:x+1)
Exception: Must produce aggregated value
```