Pandas多类别groupby分组后按组内值排序及格式化显示方法
需求说明
现有数据集包含3个字段:
country:国家goodCode:商品编码value:货值
数据覆盖150余个国家、12000余种不同商品,需要实现以下处理效果:
- 按
country、goodCode两个维度分组,对value字段求和,生成Totalvalue(总货值)列 - 以国家为分组单位,每个国家内部的商品按
Totalvalue从高到低排序 - 最终展示时,同一国家仅在分组第一行显示国家名称,其余行该字段留空,直观呈现每个国家下的商品货值排名
遇到的问题
- 执行
df.groupby(["country" ,"goodCode"]).sum().reset_index()得到的结果没有按要求排序,且每一行都重复显示国家名称,不符合展示要求 - 直接执行
sort_values(by=["Totalvalue"], ascending = False)会打乱国家分组,变成全数据集按货值全局排序,不同国家的数据混排,无法实现分组内排序的效果
实现方案
基于pandas按以下步骤处理即可,全程不会打乱国家分组:
import pandas as pd # 步骤1:分组聚合,计算每个国家对应各商品的总货值 agg_result = df.groupby(["country", "goodCode"], as_index=False)["value"].sum().rename(columns={"value": "Totalvalue"}) # 步骤2:双字段排序,优先保证相同国家数据连续,再做组内货值降序 sorted_result = agg_result.sort_values( by=["country", "Totalvalue"], ascending=[True, False], ignore_index=True ) # 步骤3:处理国家列重复值,仅保留每个国家分组首行的名称 sorted_result["country"] = sorted_result["country"].where( sorted_result["country"] != sorted_result["country"].shift(), "" )
关键逻辑说明:
- 排序时同时指定
country和Totalvalue为排序键,优先级上先按国家排序保证同国家数据连续,再在组内按货值降序,从根源避免不同国家数据混排 - 最后一步通过
shift()取上一行的国家值做对比,只有当前行是国家分组第一行时保留国名,其余行置空,完全匹配展示需求
处理完成后直接输出或导出sorted_result即可得到目标结果。
内容的提问来源于stack exchange,提问作者Daulet Karim
相关产品推荐
相关产品推荐

