pandas中如何高效统计购买列的产品组合分组出现次数
Pandas 高效实现客户购买产品组合频次统计
核心统计逻辑
遍历每个客户的购买记录,拆解出所有符合规则的产品子集组合,统计每个组合的累计出现频次、关联的客户ID列表,最终筛选重复度高的产品组合做归类分析。
分步实现代码
1. 基础数据预处理
将原始表中逗号分隔的购买产品字符串,拆分排序为结构化的产品列表,避免因为产品书写顺序不一致导致组合匹配错误:
import pandas as pd from itertools import combinations from collections import defaultdict # 加载原始示例数据 df = pd.DataFrame({ "客户ID": [1,2,3,4,5], "购买产品": ["A,B", "B,C,D", "A,B,C", "C,D,E", "A,B,C,D"] }) # 拆分产品字符串为排序列表 df["结构化产品集"] = df["购买产品"].apply(lambda x: sorted(x.split(",")))
2. 组合频次核心统计
使用可哈希的frozenset作为组合存储键,匹配不受产品顺序影响,同时搭配默认字典减少重复判断开销:
# 存储每个产品组合对应的关联客户列表 combo_record = defaultdict(list) for _, row in df.iterrows(): products = row["结构化产品集"] cust_id = row["客户ID"] # 生成组合时从长度2开始遍历,覆盖所有多产品组合场景(如需单产品统计可将起始值改为1) for combo_length in range(2, len(products)+1): for combo in combinations(products, combo_length): # 用不可变集合作为键,支持哈希匹配 combo_key = frozenset(combo) combo_record[combo_key].append(cust_id)
3. 规整输出结果
将统计字典转换为结构化DataFrame,按出现频次降序排列,和预期输出效果对齐:
# 生成最终结果表 stat_result = pd.DataFrame([ { "产品组合": set(combo), "出现次数": len(customer_list), "关联客户": customer_list } for combo, customer_list in combo_record.items() ]) # 按出现次数从高到低排序 stat_result = stat_result.sort_values("出现次数", ascending=False).reset_index(drop=True)
运行后输出的结果完全匹配示例要求:
- 组合
{A,B}出现次数为3,关联客户为1、3、5 - 组合
{B,C}出现次数为3,关联客户为2、3、5 - 组合
{C,D}出现次数为3,关联客户为2、4、5 - 组合
{A,B,C}出现次数为2,关联客户为3、5 - 组合
{B,C,D}出现次数为2,关联客户为2、5
性能优化注意事项
- 当数据量较大、单客户购买产品数较多时,不要无限制生成所有长度的组合,可根据业务需求设定最长组合长度阈值,避免全量幂集计算带来的内存爆炸问题
- 统计时可提前设置最低出现次数阈值,对低频次组合做提前过滤,减少后续结果的处理量
- 若需要快速定位高频组合,可直接基于结果表的
出现次数列做筛选,无需额外做分组聚合计算
内容的提问来源于stack exchange,提问作者Bricam
相关产品推荐
相关产品推荐

