如何输出TOP5客户及其各自TOP5采购产品的对应总销售额?
解决获取TOP5客户及其各自TOP5采购产品销售额的问题
我明白你的需求啦——你现在的代码是取出了全平台销售额最高的5条客户-产品组合记录,但这不是你想要的「先找TOP5大客户,再给每个大客户列他们自己的TOP5采购产品」的结果。我来给你一步步拆解实现方法:
步骤1:先筛选出总销售额最高的TOP5客户
首先我们得先确定哪些是总销售额最高的5个客户,这一步需要先按客户分组求和总销售额,再排序取前5:
import pandas as pd import numpy as np # 计算每个客户的总销售额,排序后取TOP5的客户名称列表 top5_customers = df1.groupby("Customer Name")["Sales"].sum()\ .sort_values(ascending=False)\ .head(5)\ .index.tolist()
步骤2:提取TOP5客户的交易数据,再分组取每个客户的TOP5产品
接下来我们只保留这5个客户的所有交易记录,然后按「客户+产品」分组计算销售额,再在每个客户内部按销售额排序取前5:
# 筛选TOP5客户的数据 → 按客户+产品求和销售额 → 排序 → 每个客户取TOP5产品 final_result = (df1[df1["Customer Name"].isin(top5_customers)] .groupby(["Customer Name", "Product Name"])["Sales"].sum() .reset_index() .sort_values(["Customer Name", "Sales"], ascending=[True, False]) .groupby("Customer Name").head(5))
代码解释:
df1[df1["Customer Name"].isin(top5_customers)]:只保留TOP5客户的所有交易记录groupby(["Customer Name", "Product Name"])["Sales"].sum():计算每个客户对每个产品的总采购额sort_values(["Customer Name", "Sales"], ascending=[True, False]):先按客户名称排序(方便后续分组),再按销售额降序排序groupby("Customer Name").head(5):对每个客户分组,取组内销售额最高的5条记录
可选:添加客户总销售额列(更直观)
如果想要同时展示每个大客户的总销售额,可以把客户总销售额合并到结果里:
# 先计算每个客户的总销售额,并重命名列 customer_total_sales = df1.groupby("Customer Name")["Sales"].sum()\ .reset_index()\ .rename(columns={"Sales": "Total Customer Sales"}) # 合并到最终结果 final_result_with_total = final_result.merge(customer_total_sales, on="Customer Name")
示例结果预览
最终你会得到类似这样的结果(以你的样本数据为例):
| Customer Name | Product Name | Sales | Total Customer Sales |
|---|---|---|---|
| Sean Miller | Cisco TelePresence System EX90 Videoconferencing Unit | 22638.48 | (Sean的总销售额) |
| Sean Miller | (他的第二高销售额产品) | (对应金额) | (Sean的总销售额) |
| Tamara Chand | Canon imageCLASS 2200 Advanced Copier | 17499.95 | (Tamara的总销售额) |
| ... | ... | ... | ... |
这样就完美实现你想要的「TOP5客户+每个客户的TOP5采购产品销售额」的需求啦!
内容的提问来源于stack exchange,提问作者Siddhesh Bhurke
相关产品推荐
相关产品推荐

