python - 有没有办法按给定数据集中某个值的百分比窗口对数据行进行分组,然后遍历数据集?
问题描述
我有一个来自一些关联规则挖掘的大 csv 文件。其中两列是规则和置信度得分。
规则列包含不同长度的项目列表,例如
[[Dog],[Dog,Cat],[Dog,Cat,Hamster],[Dog,Cat,Hamster,Goldfish]]
置信度分数列包含 0 到 1 之间的数字列表,例如
[0.1, 0.5, 0.1, 0.5]
我想根据规则值是否是其他规则值的子集来删除冗余行,但我只想删除具有相似置信度分数的行(在置信度窗口内,例如 5%)。
在上面的示例中,将保留的行是 [Dog] 和 [Dog,Cat]。
[Dog
] 将保留,因为它们的置信度得分为 0.1,[Dog]
因此[Dog,Cat,Hamster]
将被分组在一起,然后[Dog,Cat,Hamster]
将被删除,因为[Dog]
它是的子集,[Dog,Cat,Hamster]
因此该规则[Dog,Cat,Hamster]
是多余的。
同样,[Dog,Cat]
两者[Dog,Cat,Hamster,Goldfish]
的置信度分数均为 0.5,并且[Dog,Cat,Hamster,Goldfish]
将被删除,因为 [Dog,Cat] 是 [Dog,Cat,Hamster,Goldfish] 的子集。
我知道我需要做的第一件事是查看最小规则的置信度分数,将落在该分数的置信度窗口内的所有规则组合在一起,然后删除作为较小规则超集的所有规则。然后我需要移动到下一个最小的规则并做同样的事情,直到所有规则都被减少/阻止。
我想知道在 Python/Pandas 中是否有一种简单的方法可以做到这一点?
我对编码很陌生,所以我根本不知道这是否可能。
谢谢
解决方案
您可以按置信度值和规则长度对两列中的对值进行排序。然后我们将首先获得最低的 conf 分数,并且在具有相同 conf 分数的规则中,最短的列表将首先出现。我们用“双指”方法遍历这个排序的规则/配置对。第一个手指是当前规则/配置对。第二根手指移动,直到我们找到第一个规则是不相等的 conf 分数(例如,如果我们的第一根手指在 0.1 上,则为 0.5)或者如果规则不是子集(例如,如果我们的第一根手指在上面,则遇到 ['Hamster'] ['狗'])。当我们找到这样的规则/配置对时,我们附加我们的第一根手指的规则/配置对,并将我们的第一根手指推进到我们刚刚处理的那对。我们继续迭代,跳过符合我们删除标准的对,当我们发现不符合“删除”标准的对时,追加和推进。希望这是有道理的。
rules = [['Dog'],['Dog','Cat'],['Dog','Cat','Hamster','Goldfish'], ['Dog','Cat','Hamster']]
confs = [0.1, 0.5, 0.1, 0.5]
# sort by conf values and size of rules to put the shortest sub-rule in the front
ruleConfPairs = sorted(zip(rules, confs), key=lambda x: (x[1], len(x[0])))
# initialize iteration
new_rules = []
new_confs = []
current_rule = ruleConfPairs[0][0]
current_conf = ruleConfPairs[0][1]
for rule, conf in ruleConfPairs[1:]:
if current_conf == conf and set(current_rule).issubset(rule):
# skip (i.e. remove) pair if it has the same confidence value AND rule is a subset
continue
# append current rule/conf pair if either confidence score is not equal OR rule is not a subset
new_rules.append(current_rule)
new_confs.append(current_conf)
# advance our pair
current_rule = rule
current_conf = conf
# make sure to append the last pair
new_rules.append(current_rule)
new_confs.append(current_conf)
print(new_rules)
print(new_confs)
输出:
[['Dog'], ['Dog', 'Cat']]
[0.1, 0.5]
推荐阅读
- python - Win32com 与反射桌面的接口
- excel - Visual Basic .NET:在 Excel 中打开制表符分隔的文本文件
- javascript - 在 if 条件下定义和使用函数
- jquery - jQuery 代码在 index.html 中有效,但在 index.php / wordpress 主题文件中无效
- r - 如何使用 R Markdown 和 Knitr 在 HTML 输出中左对齐表格
- javascript - document.getElementById 中的左分配无效
- haskell - 使用 System.IO 和句柄从 CSV 文件中读取
- sql-server - SQL Server 函数和 WHERE
- sorting - 对从 beanshell 脚本生成的文件进行多重排序
- ios - UIPageViewController 影响 UIImage 颜色?