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

DataFrame分组聚合后组内排序取Top3、按Job总计数排序及Top5 Job获取问题

没问题,我来帮你一步步实现这个需求~

首先,咱们先把示例数据复现出来,方便后续操作:

import pandas as pd

data = {
    'count': [2,4,6,3,7,5,3,2,4,1],
    'job': ['sales','sales','sales','sales','sales','market','market','market','market','market'],
    'source': ['A','B','C','D','E','A','B','C','D','E']
}
df = pd.DataFrame(data)

第一步:分组聚合+组内取Top3

先按job和source分组聚合count的总和(你的示例里每个分组只有一条数据,聚合结果和原数据一致,但代码保持通用场景),然后对每个job组内的count按降序排序,只保留前3行:

# 执行分组聚合
agg_df = df.groupby(['job','source']).agg({'count': 'sum'})

# 每个job组内按count降序排序,取前3行
top3_per_job = agg_df.groupby('job', group_keys=False).apply(
    lambda x: x.sort_values('count', ascending=False).head(3)
)

这一步完成后,你会得到每个job下count最高的3个source,但job的顺序还是默认的字母排序(market在前)。

第二步:按job的count总和重新排序

接下来咱们根据每个job的count总和调整顺序,把总和更大的job放在前面:

# 计算每个job的count总和,按降序得到job的排序顺序
job_order = agg_df.groupby('job')['count'].sum().sort_values(ascending=False).index

# 按这个顺序重新排列结果
final_df = top3_per_job.reindex(job_order, level='job')

现在打印final_df,就得到你想要的最终结果了:

count
job    source
sales  E        7
       C        6
       B        4
market A        5
       D        4
       B        3

如果你想简化代码,也可以把步骤合并,但分开写会更清晰易懂,方便后续调整~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:42:48