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

