如何使用Pandas groupby筛选各品类销售额Top5产品
现有代码的典型错误
- 库名拼写错误:将
pandas错写为panda,导入时会直接触发模块不存在的报错 - 读文件的参数格式错误:Excel文件名作为字符串参数,需要用引号包裹,直接写
product.xlsx会被识别为未定义的变量 - 核心逻辑偏差:当前代码是将全表聚合后的销售额做全局排序取前5,无法实现每个品类下单独筛选销售额Top5的需求;同时聚合后生成的Series不存在名为
sum的列,执行sort_values(by='sum')会触发KeyError
可直接运行的正确实现代码
- 基础导入与文件读取
import pandas as pd # 替换为本地实际的Excel文件路径 sales_df = pd.read_excel("product.xlsx")
- 按品类、产品维度聚合总销售额
# 计算单品类下每个产品的累计销售额 cat_prod_sales = sales_df.groupby(["Category", "Product"], as_index=False)["Sale"].sum() cat_prod_sales = cat_prod_sales.rename(columns={"Sale": "total_sales"})
- 组内排名并筛选Top5
# 按品类分组,对组内销售额做降序排名,遇到并列销售额时按出现顺序固定排名,避免并列导致的数量偏差 cat_prod_sales["cat_rank"] = cat_prod_sales.groupby("Category")["total_sales"].rank( ascending=False, method="first" ) # 筛选每个品类下排名前5的产品 top5_each_category = cat_prod_sales[cat_prod_sales["cat_rank"] <= 5].sort_values( by=["Category", "cat_rank"] )
效果说明:最终输出的结果会按品类分组展示,每个品类下的产品按销售额从高到低排列,每个品类最多展示5条产品记录,不会出现单品类挤占全局Top5名额的问题。如果需要将销售额并列的产品全部纳入排名,可以将
rank方法的method参数改为min,适配不同的统计规则。
内容的提问来源于stack exchange,提问作者Alex osipov
相关产品推荐
相关产品推荐

