如何用Pandas统计用户购买某品类时其他品类的销售额?
Pandas实现用户多品类销售关联统计需求
先明确咱们的需求和数据:
原始数据
id cat_1 cat_2 cat_3 1 1 10 100 2 2 0 0 3 0 20 0 5 3 0 0 6 4 0 0 9 5 0 0 10 0 30 200 11 6 0 300 12 7 0 0 13 8 40 400
需求说明
统计当用户购买某品类(该品类数值不为0)时,所有品类的总销售额。比如筛选出购买过cat_1的用户后,统计这些用户在cat_1、cat_2、cat_3的总销售额,最终输出一个以品类为行和列的统计表格,期望输出如下:
cat_1 cat_2 cat_3 cat_1 36 50 800 cat_2 9 100 700 cat_3 15 80 1000
Pandas实现步骤
我给你拆解成清晰的步骤,直接复制代码就能跑通:
1. 导入Pandas并构造数据框
首先把原始数据转换成Pandas能处理的DataFrame:
import pandas as pd # 构造原始销售数据 data = { 'id': [1, 2, 3, 5, 6, 9, 10, 11, 12, 13], 'cat_1': [1, 2, 0, 3, 4, 5, 0, 6, 7, 8], 'cat_2': [10, 0, 20, 0, 0, 0, 30, 0, 0, 40], 'cat_3': [100, 0, 0, 0, 0, 0, 200, 300, 0, 400] } df = pd.DataFrame(data)
2. 核心统计逻辑
咱们的核心思路是:对每个品类,筛选出购买过该品类的用户,再统计这些用户在所有品类的总销售额,最后把结果整理成目标格式:
# 提取所有品类列(排除id列) category_columns = [col for col in df.columns if col.startswith('cat_')] # 初始化结果字典,用来存储每个品类对应的统计结果 result_dict = {} # 遍历每个品类作为目标品类 for target_category in category_columns: # 筛选出购买过当前目标品类的用户行 filtered_rows = df[df[target_category] != 0] # 统计这些用户在所有品类的总销售额 total_sales = filtered_rows[category_columns].sum() # 将结果存入字典 result_dict[target_category] = total_sales # 将字典转换为DataFrame,转置后得到行和列都是品类的表格 result_df = pd.DataFrame(result_dict).T # 打印结果,和期望输出一致 print(result_df)
运行这段代码后,你会得到和期望完全一致的输出:
cat_1 cat_2 cat_3 cat_1 36 50 800 cat_2 9 100 700 cat_3 15 80 1000
关键逻辑解释
- 用
startswith('cat_')提取品类列,避免把id列纳入统计; - 循环每个品类时,通过
df[target_category] != 0筛选出有购买行为的用户; - 对筛选后的行求和,得到该品类用户群体的各品类总销售额;
- 最后转置DataFrame,让品类同时作为行索引和列名,完美匹配需求格式。
内容的提问来源于stack exchange,提问作者nk23
相关产品推荐
相关产品推荐

