You need to enable JavaScript to run this app. 如何匹配两个DataFrame统计商品出现次数用于Apriori关联分析
优惠活动
大模型
产品
解决方案
定价
更多

如何匹配两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 06:36:04