如何用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
相关产品推荐
相关产品推荐

