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

如何用Pandas分组排序获取每个城市会员数Top5的群组

解决每个城市会员数前5群组的需求

嘿,我来帮你搞定这个需求!你已经完成了按城市+群组分组求和的第一步,接下来只需要对每个城市的结果做排序取前5的操作就行,下面给你几种实用的方法:

方法一:最直观的分组筛选法

先把你已有的分组结果转成普通列,再按城市分组取会员数最高的5个群组:

# 执行分组求和 → 重置索引(把多级索引转成列)→ 按城市分组取前5 → 清理索引
top5_groups = (clust.groupby(['city','name'])
               .agg({'members': 'sum'})
               .reset_index()
               .groupby('city')
               .apply(lambda x: x.nlargest(5, 'members'))
               .reset_index(drop=True))

这样得到的结果是一个干净的DataFrame,每一行对应一个城市的Top5群组,包含city、name、members三列。

方法二:用排名筛选法

如果你需要保留排名信息(或者后续要做更多筛选),可以先计算每个城市内的会员数排名,再筛选前5:

# 第一步:先得到所有城市+群组的会员总数
clust_sum = clust.groupby(['city','name']).agg({'members': 'sum'}).reset_index()
# 第二步:计算每个城市内的会员数排名(降序,并列时按出现顺序取)
clust_sum['rank'] = clust_sum.groupby('city')['members'].rank(ascending=False, method='first')
# 第三步:筛选排名≤5的记录,去掉排名列
top5_groups = clust_sum[clust_sum['rank'] <= 5].drop('rank', axis=1)

method='first'参数很重要,它能避免并列会员数的群组被重复计数,保证每个城市刚好取到5个群组。

方法三:更简洁的多级索引操作

如果你不想重置索引,可以直接基于多级索引操作,代码更短:

top5_groups = (clust.groupby(['city','name'])
               .agg({'members': 'sum'})
               .groupby(level='city', group_keys=False)
               .nlargest(5))

这里用level='city'指定按第一级索引(城市)分组,group_keys=False让结果不会保留多余的分组层级,输出的是一个保留city和name为多级索引的结果,如果你需要转成普通列,再加个.reset_index()就行。

举个例子(基于你的样本数据)

比如你的Bath城市,执行后会得到以下Top5群组:

  • Agile Bath & Bristol:957
  • Bath Machine Learning Meetup:435
  • AWS Bath User Group:346
  • Bath JS:142
  • Bath Crypto Chat:47

内容的提问来源于stack exchange,提问作者snow_fall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:15:53