如何在Python中重构数据以适配Apriori算法?
交易数据转布尔矩阵(Apriori算法适用)
需求说明
将包含ID(交易ID)和Articles(商品,单个数字或数字列表)的数据集,转换为每行对应一个交易、每列对应一个商品的布尔矩阵,单元格值为True/False表示该交易是否包含对应商品,用于Apriori关联规则挖掘。
实现方案(Python)
以下提供两种常用实现方式,均基于pandas库:第一种借助专门的机器学习工具库更高效,第二种纯pandas实现更灵活。
方法1:使用mlxtend库(推荐)
mlxtend的TransactionEncoder专为交易数据编码设计,适合大规模数据集:
import pandas as pd from mlxtend.preprocessing import TransactionEncoder # 1. 构造示例数据集(替换为你的实际数据) data = { "ID": ["ID1", "ID2", "ID3"], "Articles": [[1,2,3], [1,2], 4] } df = pd.DataFrame(data) # 2. 统一格式:将单个商品转为列表 df["Articles"] = df["Articles"].apply(lambda x: [x] if isinstance(x, int) else x) # 3. 编码生成布尔矩阵 te = TransactionEncoder() # 拟合数据并转换 encoded_data = te.fit(df["Articles"]).transform(df["Articles"]) # 转为DataFrame,列名为商品编号 encoded_df = pd.DataFrame(encoded_data, columns=te.columns_) # 4. 合并交易ID并设置为索引 result = pd.concat([df["ID"], encoded_df], axis=1).set_index("ID") print(result)
输出结果:
1 2 3 4 ID ID1 True True True False ID2 True True False False ID3 False False False True
方法2:纯pandas实现
无需额外库,手动生成布尔矩阵:
import pandas as pd # 1. 构造示例数据集 data = { "ID": ["ID1", "ID2", "ID3"], "Articles": [[1,2,3], [1,2], 4] } df = pd.DataFrame(data) # 2. 统一格式:单个商品转列表 df["Articles"] = df["Articles"].apply(lambda x: [x] if isinstance(x, int) else x) # 3. 提取所有唯一商品 all_articles = [] for items in df["Articles"]: all_articles.extend(items) unique_articles = sorted(set(all_articles)) # 4. 为每个商品生成布尔列 for article in unique_articles: df[str(article)] = df["Articles"].apply(lambda x: article in x) # 5. 整理结果:删除原Articles列,设置ID为索引 result = df.drop("Articles", axis=1).set_index("ID") print(result)
输出结果与方法1一致。
内容的提问来源于stack exchange,提问作者imane
相关产品推荐
相关产品推荐

