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

Pandas多类别groupby分组后按组内值排序及格式化显示方法

需求说明

现有数据集包含3个字段:

  • country:国家
  • goodCode:商品编码
  • value:货值
    数据覆盖150余个国家、12000余种不同商品,需要实现以下处理效果:
  1. 按country、goodCode两个维度分组,对value字段求和,生成Totalvalue(总货值)列
  2. 以国家为分组单位,每个国家内部的商品按Totalvalue从高到低排序
  3. 最终展示时,同一国家仅在分组第一行显示国家名称,其余行该字段留空,直观呈现每个国家下的商品货值排名
遇到的问题
  • 执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:39:37