如何匹配两个DataFrame统计商品出现次数用于Apriori关联分析
解决步骤
方法1:基于你已拆分的交易宽表处理
你拆分后得到的DataFrame每一行对应一笔交易,每列存储对应交易的商品编号,直接按以下逻辑生成独热编码矩阵即可:
import pandas as pd # 堆叠所有非空商品编号、生成独热编码、按交易行聚合 transaction_onehot = pd.get_dummies(transaction_df.stack()).groupby(level=0).sum()
输出的transaction_onehot每行对应一笔交易,列名为商品编号,值为1代表该交易包含对应商品,0代表未购买。
接下来匹配Item表替换列名为商品名称,方便后续查看结果:
# 生成商品编号到名称的映射字典 item_map = item_df.set_index('Item')['ProductName'].to_dict() # 替换独热矩阵列名 transaction_onehot = transaction_onehot.rename(columns=item_map)
如果需要统计所有商品的总出现次数,直接对列求和即可:
product_count = transaction_onehot.sum().sort_values(ascending=False)
方法2:更适合万级数据的高效处理方案
你之前拆分生成宽表的步骤可以省略,直接从原始交易表处理,性能更高也不需要额外处理空值:
# 先把每行交易字符串转为商品编号列表 # 用\s+匹配多个空格,避免原始数据多空格分隔产生脏值 trans_list = transactions['Transaction'].str.split('\s+') # 直接生成独热编码矩阵 from sklearn.preprocessing import MultiLabelBinarizer mlb = MultiLabelBinarizer() transaction_onehot = pd.DataFrame( mlb.fit_transform(trans_list), columns=mlb.classes_ ) # 后续匹配Item表、统计次数的操作和方法1完全一致 item_map = item_df.set_index('Item')['ProductName'].to_dict() transaction_onehot = transaction_onehot.rename(columns=item_map)
后续Apriori调用
得到的transaction_onehot就是符合Apriori输入要求的0/1矩阵,直接传入算法接口即可,示例用mlxtend库实现:
from mlxtend.frequent_patterns import apriori, association_rules # 挖掘频繁项集,min_support可根据业务需求调整 frequent_itemsets = apriori(transaction_onehot, min_support=0.2, use_colnames=True) # 生成关联规则,可按lift、confidence等指标筛选排序 rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
内容的提问来源于stack exchange,提问作者Muha Shahada
相关产品推荐
相关产品推荐

