使用pyfpgrowth与pandas挖掘频繁模式遇问题求助
使用pyfpgrowth与pandas挖掘频繁模式的问题排查与解决
我来帮你梳理下当前遇到的问题,从你给出的结果来看,出现了(' ',)这种包含空格的无效项集,这明显不符合业务预期,大概率是数据格式没处理对导致的。结合你的代码流程,我来拆解问题并给出解决办法:
问题根源分析
你当前直接把pandas的字符串列传给pyfpgrowth.find_frequent_patterns(),但这个函数要求的输入是每个元素为列表/可迭代对象的交易集合——简单说,每条交易得是一个包含多个商品项的列表,而不是单个字符串。当你传入字符串时,pyfpgrowth会把字符串拆成单个字符(包括空格)来处理,这就导致了空格被当成了一个商品项,出现了奇怪的结果。
分步解决方案
1. 先检查并清洗交易数据
首先,你需要确认itemsets1.csv里的每条交易记录格式,比如是不是用逗号、空格或者其他分隔符把商品项分开的。先打印几条数据看看:
print(data['itemsets'].head())
假设你的每条记录是类似"1,8,3"这样用逗号分隔的字符串,那第一步要把它拆成列表:
# 用逗号拆分字符串,得到商品项列表 data['itemsets'] = data['itemsets'].str.split(',') # 如果是空格分隔,就用不带参数的str.split():data['itemsets'].str.split()
然后还要清洗掉无效的项,比如空字符串、纯空格的项,同时过滤空交易:
# 清洗每个商品项的空格,并去掉空项 data['itemsets'] = data['itemsets'].apply(lambda x: [item.strip() for item in x if item.strip()]) # 过滤掉没有有效商品项的交易记录 data = data[data['itemsets'].apply(lambda x: len(x) > 0)]
2. 正确调用频繁项集挖掘函数
处理完数据后,要把Series转换成列表的列表再传给函数,因为pyfpgrowth需要的是交易集合的迭代器:
patterns = pyfpgrowth.find_frequent_patterns(data['itemsets'].tolist(), 6)
3. 验证结果
这时候得到的频繁项集应该就正常了,比如会是类似这样的结果:
{('1',): 9, ('1', '8'): 6, ('8',): 6}
额外提醒
- 确保你的CSV文件里所有交易记录的分隔符是统一的,别有的用逗号有的用空格;
- 最小支持度参数(这里的6)要根据你的数据集大小调整,太小会得到大量冗余项,太大则可能找不到有价值的模式;
- 如果原始数据里有缺失值,记得提前用
data.dropna()处理掉,避免影响结果。
内容的提问来源于stack exchange,提问作者K_ Douli
相关产品推荐
相关产品推荐

