Pandas分组聚合后取均值TOP5的语法错误排查与正确写法
聚合后按均值取TOP5的语法错误解决
问题场景
想要从聚合后的均值指标中获取TOP5数据,编写了如下代码:
cohort = ['year','month','maincategory','subcategory'] poorresult = stmpoor.groupby(cohort,as_index=False).agg({'resolvetime': ['count','mean'], 'grouptransfers': ['mean']}).apply(lambda x: x.nlargest(5, ('resolvetime','mean'))
运行时抛出错误:
ValueError: keep must be either "first", "last" or "all"
尝试添加keep='all'后修改代码(注释掉报错部分):
poorresult = stmpoor.groupby(cohort,as_index=False).agg({'resolvetime': ['count','mean'], 'grouptransfers': ['mean']})# .apply(lambda x: x.nlargest(5, ('resolvetime','mean'),keep='all'))
又出现错误:
TypeError: Series.nlargest() got multiple values for argument 'keep'
错误原因
- 首次代码存在语法错误:
apply的lambda表达式末尾缺少右括号 - 聚合后的结果是多层列索引的DataFrame,直接使用
apply时可能误将操作作用在Series上,导致调用Series.nlargest时参数不匹配(Series.nlargest的参数顺序和DataFrame.nlargest不同,会出现参数多值的问题)
正确写法
根据实际需求,分两种情况处理:
情况1:全局取TOP5(所有聚合结果中按均值排前5)
如果是要在所有聚合后的结果里,直接按resolvetime的均值列取TOP5,不需要用apply,直接对聚合后的DataFrame调用nlargest即可:
cohort = ['year','month','maincategory','subcategory'] # 先完成聚合操作 agg_result = stmpoor.groupby(cohort, as_index=False).agg( {'resolvetime': ['count','mean'], 'grouptransfers': ['mean']} ) # 全局筛选TOP5,keep='all'保留所有与第5名均值相同的行 poorresult = agg_result.nlargest(5, ('resolvetime', 'mean'), keep='all')
keep='all':保留所有和第5名均值相同的行keep='first':只取前5个(即使有相同值,仅保留最早出现的条目)
情况2:分组内取TOP5(指定分组维度内按均值取前5)
如果需求是按某几个维度分组后,每个分组内部取TOP5(比如按year+month分组,每个月内取maincategory+subcategory的TOP5),可以先完成全维度聚合,再按目标维度分组并调用apply:
cohort = ['year','month','maincategory','subcategory'] # 先完成全维度聚合 agg_result = stmpoor.groupby(cohort, as_index=False).agg( {'resolvetime': ['count','mean'], 'grouptransfers': ['mean']} ) # 按year和month分组,每个组内取resolvetime均值TOP5 poorresult = agg_result.groupby(['year','month'], group_keys=False).apply( lambda x: x.nlargest(5, ('resolvetime', 'mean'), keep='all') )
这里group_keys=False可以避免分组键作为额外列添加到结果中,apply的lambda参数x是每个分组的DataFrame,调用DataFrame.nlargest参数匹配正确。
内容的提问来源于stack exchange,提问作者Mark G
相关产品推荐
相关产品推荐

