在groupby中使用.nth命令并保留分组列的方法
解决groupby.nth保留分组列并取第10大值的问题
你当前代码的核心问题有两个:一是仅选取prox列做分组操作,导致结果默认只返回该列;二是.nth(10)取的是分组内原始顺序的第10个元素,而非你需要的第10大值。以下是几种能同时保留gameId、playId分组列,且正确取到prox第10大值的方案:
方案一:分组排序后取目标元素
先对每个分组的prox做降序排序,再提取对应位置的元素,同时保留所有列:
# 按分组列聚合,对每个分组内的prox降序排序 sorted_tmom = tmom.groupby(['gameId', 'playId']).apply(lambda group: group.sort_values('prox', ascending=False)) # 重置多余层级索引,再分组取第10大值(pandas索引从0开始,第10大对应索引9) test = sorted_tmom.reset_index(drop=True).groupby(['gameId', 'playId'], as_index=False).nth(9)
方案二:用nlargest直接取第10大值
利用nlargest提取每个分组的前10大prox值,再取最后一个(即第10大),写法更直观:
# 对每个分组取prox前10大的行,再取最后一行(第10大),最后重置索引 test = tmom.groupby(['gameId', 'playId']).apply(lambda group: group.nlargest(10, 'prox').iloc[-1]).reset_index(drop=True)
方案三:全局排序后分组取值
先对整个DataFrame按prox降序排序,再按分组列取目标元素,适合数据量不大的场景:
# 先按prox降序排全局数据,再分组取第10大值 test = tmom.sort_values('prox', ascending=False).groupby(['gameId', 'playId'], as_index=False).nth(9)
关键说明
- 索引注意:pandas的
.nth()使用0-based索引,如果要取第10大的prox值,需传入参数9;若你的需求是取分组内原始顺序的第10个元素(不考虑大小),则用10。 - 以上方案都会自动保留
gameId、playId和prox列,无需额外冗余操作。
内容的提问来源于stack exchange,提问作者Joseph Mellor
相关产品推荐
相关产品推荐

