使用Python统计DataFrame中跨订单出现频次最高的商品类别对
数据集说明
该数据集共4列,下方仅展示前14行,实际总数据量超10000行,同一订单下会向客户售卖多款商品。
统计需求
统计所有订单中共同出现频次最高的商品类别对,例如(Cat1和Cat2)。仅使用Python实现,可调用numpy、pandas等常用第三方库。
备注
- 商品仅包含3个类别
- ProdID为唯一标识列
- OrderID、Client ID不存在重复值
示例数据
OrderID ProdID Prodcategory Client ID 4997 1 Cat 1 21 4997 2 Cat 1 22 4997 3 Cat 2 23 4997 4 Cat 3 24 2001 5 Cat 1 25 2001 6 Cat 2 26 2001 7 Cat 2 27 2001 8 Cat 2 28 2001 9 Cat 3 29 2376 10 Cat 3 30 2376 11 Cat 1 31 2376 12 Cat 2 32 2376 13 Cat 3 33 2376 14 Cat 1 34
统计规则
同一订单下的所有不重复类别两两组成配对,每对在单个订单中仅计数1次,最终统计所有订单中各配对的总出现次数,找出频次最高的配对。例如订单4997中(Cat 1, Cat 2)、(Cat 2, Cat 3)、(Cat 1, Cat 3 )各计数1次,订单2001中该三类配对也各计数1次,最终统计所有订单的总计数即可得到结果。
原有方案问题
原有实现仅能统计单个类别的整体出现频次,无法统计类别配对的共同出现频次,无法满足需求,原有代码如下:
# Import required libraries import pandas as pd import matplotlib.pyplot as plt # Read the data into the dataframe #df = pd.read_clipboard() df df.columns df["Product category "].value_counts() mylabels = ['Cat 2', 'Cat 1', 'Cat 3'] plt.pie(df["Product category "].value_counts(), labels = mylabels) plt.show()
可行实现方案
核心思路是先按订单分组去重类别,再生成两两无顺序配对统计次数,代码如下:
import pandas as pd from itertools import combinations # 读取数据,可替换为pd.read_csv("你的数据文件路径.csv") df = pd.read_clipboard() # 按订单ID分组,获取每个订单下的唯一商品类别 order_unique_cats = df.groupby('OrderID')['Prodcategory'].unique() pair_count = {} for cats in order_unique_cats: # 仅处理包含2类及以上商品的订单 if len(cats) >= 2: # 生成排序后的两两无重复组合,避免(Cat1,Cat2)和(Cat2,Cat1)被判定为不同配对 for pair in combinations(sorted(cats), 2): pair_count[pair] = pair_count.get(pair, 0) + 1 # 转换为Series方便排序查看 pair_result = pd.Series(pair_count).sort_values(ascending=False) # 输出结果 print("所有类别对出现频次:") print(pair_result) print(f"\n频次最高的类别对为{pair_result.index[0]},共出现{pair_result.iloc[0]}次")
示例数据运行结果
上述示例数据中3个订单均同时包含3类商品,因此3个配对的出现次数均为3次,运行后输出如下:
所有类别对出现频次: (Cat 1, Cat 2) 3 (Cat 1, Cat 3) 3 (Cat 2, Cat 3) 3 dtype: int64 频次最高的类别对为('Cat 1', 'Cat 2'),共出现3次
内容的提问来源于stack exchange,提问作者Abhishek Patil
相关产品推荐
相关产品推荐

