You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:08:38