有没有一种方法可以按给定数据集中某个值的百分比窗口对数据行进行分组,然后遍历数据集?

2024-04-27 21:24:34 发布

您现在位置: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将保留,因为[Dog][Dog,Cat,Hamster]将由于其置信度得分为0.1而分组在一起,然后[Dog,Cat,Hamster]将被删除,因为[Dog][Dog,Cat,Hamster]的子集,因此[Dog,Cat,Hamster]规则是冗余的

类似地,[Dog,Cat][Dog,Cat,Hamster,Goldfish]都有0.5的置信度,并且[Dog,Cat,Hamster,Goldfish]将被删除,因为[狗,猫]是[狗,猫,仓鼠,金鱼]的子集

我知道我需要做的第一件事是查看最小规则的置信度得分,将该得分的置信窗口内的所有规则组合在一起,然后删除所有较小规则的超集规则。然后我需要移动到下一个最小的规则并执行相同的操作,直到所有规则都被缩减/删除

我想知道在Python/Pandas中有没有一种简单的方法可以做到这一点

我对编码很陌生,所以我不知道这是否可行

谢谢


Tags: 文件csv项目示例列表规则数字分数
1条回答
网友
1楼 · 发布于 2024-04-27 21:24:34

您可以根据置信值和规则长度对两列中的成对值进行排序。然后我们将首先得到最低的conf分数,在具有相同conf分数的规则中,最短的列表将首先出现。我们使用“两个手指”的方法遍历这个排序规则/conf对。第一个指针是当前的rule/conf对。第二个手指移动,直到我们找到第一个规则,它要么是不相等的conf分数(例如,如果我们的第一个手指在0.1上,则为0.5),要么是规则不是子集(例如,如果我们的第一个手指在['Dog']上,则为['仓鼠'])。当我们找到这样的rule/conf对时,我们附加第一个手指的rule/conf对,并将第一个手指前进到我们刚刚处理的那一对。我们继续迭代,跳过属于我们要删除的条件的对,当我们发现不符合“删除”条件的对时,追加并前进。希望这有意义

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]

相关问题 更多 >