Pandas使用技巧之groupby+apply/agg

背景

分组计算指标是使用pandas进行数据分析的常用操作,今天分享一下groupby+apply
/agg/rank这套组合拳的用法。

数据

数据是学生id、周末参加的辅导班名称、考试成绩:
df=pd.DataFrame({‘id’:[1,1,2,2,1,1,1],‘class’:[‘a’,‘a’,‘c’,‘c’,‘b’,‘b’,‘b’],‘score’:[100,90,80,70,60,50,40]})

groupby+apply

现在想统计每个id参加的class个数(剔除重复),那么我们就可以使用groupby+apply完成这个单指标的计算。

res=df.groupby('id').apply(lambda x: x['class'].drop_duplicates().shape[0]) 

注意上面的x是一个dataframe:
id class
0 1 a
1 1 a
4 1 b
5 1 b
6 1 b
返回的res是series,res[id]可以得到对应的值,series有些像list+dict复合体。

#将series结果保存为dataframe
res2=pd.DataFrame()
res2['id']=res.index
res2['cnt']=res.values

groupby+agg

如果我们想统计多个指标,并且每个指标都仅仅依赖于某列,那么就非常适用于使用groupby+agg。比如统计每个id参加的class个数(剔除重复),以及其中class出现次数的最小最大值。代码如下:

def get_cnt(df):
    return df.drop_duplicates().shape[0]

def get_min(df):
    return df.value_counts().min()

def get_max(df):
    return df.value_counts().max()

res=df.groupby('id').agg({'class': [get_cnt, get_min, get_max]})

得到的res如下:
在这里插入图片描述
res的index是id,所以我们需要重置index,并重新对列进行命名。

res=res.reset_index()
res.columns=['id','cnt','min','max']

在这里插入图片描述

groupby+rank

这个组合用于分组排序。

df=pd.DataFrame({'id':[1,1,2,2,1,1,1],'class':['a','a','c','c','b','b','b'],'score':[100,90,80,70,60,50,40]})
df['rn']=df['score'].groupby(df['id']).rank()

输出结果:
在这里插入图片描述

大功告成!

总结

场景groupby+applygroupby+agg
基于单列计算单特征OO
基于单列计算多特征OO
基于多列计算单特征OX
基于多列计算多特征OX

本文原创,转载请注明本文出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值