根据特定列值删除一行并删除另一个文件中的实例?

Deleting a row on the basis of a particular column value and deleting the instances of that in another file?

我有一个 ruleset,它是我从 iris_dataset 生成的,如下所示

2,3,2,3,1
*,*,*,4,2
2,*,2,2,1
*,1,*,4,2
1,*,*,3,2
*,*,*,1,0
*,*,3,*,2
3,*,*,*,2
2,1,3,2,2
1,1,2,3,2
*,*,3,4,2
3,*,3,*,2
*,*,1,1,0
2,1,3,3,1
2,*,*,3,1
2,2,2,4,1
*,*,*,3,1
*,*,1,*,0
*,*,3,2,2
*,2,2,*,1
*,*,2,2,1

其中前 4 列是 4 个属性值,例如 a0、a1、a2、a3,第五列是 class 值。 *代表不关心。例如 2,*,*,3,1 表示如果 a0=2 和 a3=3 那么我们不关心 a1 和 a2,class 将 = 1.

现在我也有一个 dataset(在这个问题的末尾给出),我正在与这个规则集进行比较,使用混淆矩阵的概念来获得每个规则的 fitness规则。

为了健身我写了一个代码:

import re
import sys
dataset = sys.argv[1];
ruleset = sys.argv[2];

with open(ruleset, 'r') as infile:
    rules = [list(map(str, line.split(','))) for line in infile]
   
for i in rules:
    i[-1] = i[-1].replace("\n","")
    
with open(dataset, 'r') as infile:
    rows = [list(map(int, line.split(','))) for line in infile]
new_rules = []

for rule in rules:

    class_ = rule[-1]
    tp = 0
    fn = 0
    tn = 0
    fp = 0
    pat = ''
    
    for i in rule[1:-1]: 
        if i == '*' : pat+='\d'
        else : pat+=i
        
    for element in rows:
        pattern = re.compile(pat)
        element = list(map(str, element))
        mat = pattern.match(''.join(element[:-1]))
        
        if mat:
            if element[-1] == class_:
                tp+=1
            elif element[-1] != class_:
                fp+=1
        else:
            if element[-1] == class_:
                fn+=1
            else:
                tn+=1
    
    print(f"True Positive: {tp}, False Negative: {fn}, True Negative: {tn}, False Positive : {fp}")
    fitness_1 = ((tp+tn)/(tp+tn+fp+fn))
    fitness = "{:.2f}".format(fitness_1)
    new_rules.append(rule + [fitness])
    
item_list = []

for i in new_rules:
    i = list(map(str, i))
    s = ','.join(i)
    item_list.append(s)
with open("final_output_", "w") as outfile:
    outfile.write("\n".join(item_list))
    
f = open("final_output_", "r")
content = f. read()
print(content, sep='\n')
f. close()

现在 final_output_ 文件看起来像:

2,3,2,3,1,0.66
*,*,*,4,2,0.67
2,*,2,2,1,0.71
*,1,*,4,2,0.67
1,*,*,3,2,0.95
*,*,*,1,0,1.00
*,*,3,*,2,0.49
3,*,*,*,2,0.33
2,1,3,2,2,0.67
1,1,2,3,2,0.67
*,*,3,4,2,0.67
3,*,3,*,2,0.49
*,*,1,1,0,0.72
2,1,3,3,1,0.67
2,*,*,3,1,0.39
2,2,2,4,1,0.67
*,*,*,3,1,0.39
*,*,1,*,0,0.22
*,*,3,2,2,0.66
*,2,2,*,1,0.64
*,*,2,2,1,0.71

最后一列只是该特定规则的适用性。现在我想对它进行排序,首先根据 class,然后根据它们的适应度,以便排序后看起来像:

*,*,*,1,0,1.00
*,*,1,1,0,0.72
*,*,1,*,0,0.22
*,*,2,2,1,0.71
.
.
.
.
3,*,*,*,2,0.33

然后我想从 class 0 中选择第一条规则(具有最高的适应性)并将其放在一个单独的文件中说 ruleset_new 并检查该规则是否存在于下面给定的数据集中.并且该规则的数据集中的所有实例都将被删除,并且将使用 dataset 的剩余行生成一个新的数据集,比如 dataset_new。以前的规则集现在少了一个规则。再次在此 ruleset 上,将使用上述代码与 dataset_new 进行比较来计算适应度。然后在下一次 class 1 中的第一个规则(具有最高适应度)将被选择并放入 ruleset_new 并且将重复相同的事情直到数据集的所有实例都将被覆盖。

下面是dataset

3,1,3,3,2
1,2,1,1,0
1,1,1,1,0
2,2,3,4,2
1,3,1,1,0
2,1,2,2,1
1,1,1,1,0
2,1,3,4,2
2,2,2,2,1
1,1,2,2,1
2,1,3,4,2
3,3,3,4,2
2,1,2,2,1
1,1,2,2,1
2,1,3,4,2
2,1,2,2,1
2,1,3,4,2
1,2,1,1,0
1,2,1,1,0
2,2,2,2,1
2,1,2,2,1
2,1,2,4,2
2,3,1,1,0
1,3,1,1,0
2,1,3,4,2
2,1,3,4,2
1,1,2,2,1
1,1,2,2,1
2,1,2,2,1
3,1,3,4,2
2,1,3,4,2
2,2,3,4,2
2,1,3,4,2
2,2,3,4,2
2,3,1,1,0
2,1,2,2,1
3,1,3,4,2
1,3,1,1,0
2,1,3,4,2
2,2,2,2,1
2,1,2,2,1
1,3,1,1,0
1,2,1,1,0
1,1,1,1,0
1,2,1,1,0
2,1,2,2,1
2,2,3,4,2
2,3,3,4,2
2,1,2,2,1
2,1,2,2,1
1,3,1,1,0
2,1,2,2,1
3,1,3,4,2
2,1,3,4,2
2,2,3,4,2
3,1,3,4,2
2,1,2,2,1
2,1,2,2,1
1,3,1,1,0
1,3,1,1,0
1,3,1,1,0
2,1,2,2,1
1,1,1,1,0
1,3,1,1,0
2,1,2,2,1
1,3,1,1,0
1,1,2,2,1
2,1,2,2,1
1,1,2,2,1
1,1,2,3,2
2,1,2,2,1
2,1,3,4,2
1,3,1,1,0
3,1,3,4,2
2,1,3,4,2
3,2,3,4,2
2,1,3,2,2
1,3,1,1,0
2,1,2,4,2
2,1,2,2,1
2,2,3,4,2
1,3,1,1,0
2,1,3,2,2
2,1,2,4,2
2,2,3,4,2
1,3,1,1,0
2,1,2,2,1
1,3,1,1,0
2,1,2,4,2
3,1,3,4,2
1,1,2,2,1
2,3,3,4,2
2,1,3,4,2
2,1,2,2,1
1,3,1,1,0
2,1,2,2,1
1,3,1,1,0
2,1,2,2,1
1,3,1,1,0
1,3,1,1,0
1,3,1,1,0
3,3,3,4,2
2,1,2,2,1
1,3,1,1,0
1,3,1,1,0
2,2,3,4,2
2,1,3,4,2
2,1,3,4,2
1,3,1,1,0
3,1,3,4,2
2,1,3,3,1
1,1,1,1,0
2,2,3,4,2
1,3,1,1,0
2,1,3,3,1
1,2,1,1,0
2,1,2,2,1
2,3,1,1,0
1,1,1,1,0
1,2,1,1,0
3,3,3,4,2
2,1,2,2,1
1,3,1,1,0
1,1,2,2,1
1,2,1,1,0
1,2,1,1,0
2,2,2,2,1
2,1,2,2,1
2,1,2,2,1
2,2,3,4,2
1,1,2,2,1
1,1,2,2,1
2,3,2,3,1
2,2,2,2,1
2,2,2,4,1

举个例子,比较 rulesetdataset 并找到实例意味着:ruleset 中的 1,*,*,3,2 在 [= 中有 1,1,2,3,2 19=].

请帮帮我。我是 python 的新手,所以无法弄清楚。

我不太确定你在问什么,因为你的 post 中没有任何明显的明确问题。在我看来,您不确定如何对规则进行排序,这些规则是存储在列表中的字符串列表,并且您想在倒数第二列(您称为“class”)。这是对您问题的正确解释吗?

如果这是正确的解释,那么要对 Python 中的任何列表进行排序,您可以使用 sorted() 函数,您可以阅读有关 in the official python documentation 的内容。一个可能的解决方案是:

sorted_rules_on_fitness = sorted(new_rules,key = lambda rule: rule[-1])
sorted_rules_on_class = sorted(sorted_rules_on_fitness,key = lambda rule: rule[-2])

通过首先对优先级最低的项目进行排序,您可以利用排序保留具有相同键的元素出现在未排序列表中的顺序。我希望这对你有帮助,但如果你有后续问题或对你原来的问题的澄清,请不要犹豫回答。