Pandas使用技巧之groupby+apply/agg

本文介绍如何使用Pandas库中的groupby结合apply、agg及rank函数进行高效的数据分组计算。通过具体案例展示了单指标或多指标的计算方法,帮助读者掌握数据处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

分组计算指标是使用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

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

Pandas中,groupby函数可以根据指定的列对DataFrame进行分组,并对每个分组应用聚合函数。agg函数是groupby函数的一个参数,用于指定要应用的聚合函数。例如,可以使用agg函数来计算每个分组中的最大值、平均值使用agg函数时,可以将聚合函数作为一个列表传递给f_agg参数。例如,可以使用['max', 'mean', 'sum']来计算每个分组中的最大值、平均值。 另外,groupby对象还有其他一些有用的方法,如transformapply。transform方法可以对每个分组进行操作,并返回一个与原始DataFrame具有相同形状的新DataFrame。例如,可以使用transform方法来填充每个分组中的空值。 apply方法可以对每个分组应用自定义的函数,并返回一个包含结果的新DataFrame。例如,可以使用apply方法来填充每个分组中的空值。 综上所述,使用groupbyagg方法可以对DataFrame进行分组并应用聚合函数,而transformapply方法可以对每个分组进行操作,并返回一个新的DataFrame。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Pandas DataFrame: groupby agg使用](https://blog.csdn.net/chenhepg/article/details/125567150)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值