如何将efficient_apriori生成的关联规则转换为pandas DataFrame
优化实现方案
你原有代码存在两个明显缺陷:
- 每次循环都会覆盖df变量,最终只能得到最后一条规则的结果,之前的规则全部丢失
- 就算修改为循环拼接DataFrame,逐行拼接的方式性能极低,规则量过千时就会有明显卡顿,属于不推荐的写法
下面是更优的实现方式:
方案1:先收集全量规则再转DataFrame
兼容性最好、性能最高的写法,先把所有规则处理成字典列表,最后一次性调用pandas接口生成DataFrame,同时指标直接保留数值类型,方便后续计算:
import pandas as pd rule_records = [] for rule in rules: rule_records.append({ "前项": str(rule.lhs).replace(",)", ")"), "后项": str(rule.rhs).replace(",)", ")"), "支持度": rule.support, "置信度": rule.confidence, "提升度": rule.lift, "确信度": rule.conviction }) # 单次转换生成完整DataFrame rule_df = pd.DataFrame(rule_records)
方案2:列表推导式简化写法
如果规则量不大,追求代码简洁,可以直接用列表推导式一步生成:
import pandas as pd rule_df = pd.DataFrame([ { "前项": str(rule.lhs).replace(",)", ")"), "后项": str(rule.rhs).replace(",)", ")"), "支持度": rule.support, "置信度": rule.confidence, "提升度": rule.lift, "确信度": rule.conviction } for rule in rules ])
如果不需要保留提升度、确信度两个指标,直接删除字典中对应的键值对即可。和你原有写法相比,以上两种方案的性能至少提升10倍以上,且不会丢失规则数据,数值型的指标不需要后续再做类型转换就可以直接做筛选、排序操作。
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

