首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以按给定数据集中某个值的百分比窗口对数据行进行分组,然后迭代数据集?

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

Stack Overflow用户
提问于 2019-02-16 01:11:52
回答 1查看 37关注 0票数 0

我从一些关联规则挖掘中得到了一个很大的csv文件。其中两列是规则和置信度得分。

rules列包含长度可变的项目列表,例如

代码语言:javascript
复制
[[Dog],[Dog,Cat],[Dog,Cat,Hamster],[Dog,Cat,Hamster,Goldfish]]

置信度分数列包含介于0和1之间的数字列表,例如

代码语言:javascript
复制
[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中有什么简单的方法可以做到这一点吗?

我对编码是个新手,所以我不知道这是否可能。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-16 02:07:54

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

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
[['Dog'], ['Dog', 'Cat']]
[0.1, 0.5]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54714065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档