使用pandas groupby按周统计各branch共同购买商品组合的出现频率
Pandas 订单组合频次统计实现方案
核心注意点
因为要求订单内元素顺序不影响组合判定,所以聚合时需要先对每个订单的对应字段列表做排序,同时转为可哈希的tuple类型才能用于后续分组计数。
完整实现代码
import pandas as pd # 构造示例DataFrame(实际使用时替换为你的原始df即可) data = { 'date': ['2021-05-04', '2021-06-04', '2021-05-06', '2021-07-06', '2021-07-06', '2021-07-05', '2021-10-04'], 'category': ['A', 'A', 'B', 'A', 'C', 'A', 'D'], 'subcategory': ['aa', 'dd', 'aa', 'aa', 'cc', 'ff', 'aa'], 'order_id': [10, 10, 18, 50, 10, 101, 100], 'product_id': [5, 2, 3, 10, 15, 30, 15], 'branch': ['web', 'web', 'shop', 'web', 'web', 'shop', 'shop'] } df = pd.DataFrame(data) df['date'] = pd.to_datetime(df['date']) # 第一步:按订单、分支分组重采样,生成排序后的组合 order_comb = ( df.set_index('date') .groupby(['order_id', 'branch']) .resample('W-MON', label='left') .agg({ # 排序后转tuple,消除顺序影响同时满足哈希要求 'category': lambda x: tuple(sorted(x)), 'subcategory': lambda x: tuple(sorted(x)), 'product_id': lambda x: tuple(sorted(x)) }) .reset_index() ) # 第二步:按分支、周分组,统计各组合的出现频次 def count_combination(group): result = {} for col in ['category', 'subcategory', 'product_id']: # 按频次倒序统计 count_series = group[col].value_counts().sort_values(ascending=False) # 转换为要求的「频次, 组合列表」格式 result[col] = [f"{cnt}, {list(comb)}" for comb, cnt in count_series.items()] return pd.Series(result) stat_result = order_comb.groupby(['branch', 'date']).apply(count_combination) # 可选:将日期转为列,和你给出的示例展示结构完全一致 stat_result_unstack = stat_result.unstack(level='date')
输出说明
- 直接查看
stat_result即可得到按branch、周分层的统计结果,每个层级下对应category、subcategory、product_id三个维度的频次+组合列表 - 如果需要提取指定维度的结果,可通过索引直接取值:比如
stat_result.loc[('web', '2021-05-04'), 'category']即可拿到web分支对应周的category组合统计列表
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

