如何在数据集中查找和排序重复项

时间:2013-12-08 12:43:19

标签: python pandas machine-learning

我有两个数据集,我用pandas Dataframe读入。让我们将它们设置为1并设置2.设置1和设置2包含文本文档。第1组中的一些文本文档出现在第2组中,我正在寻找一种方法来查找这些副本。我首先考虑使用集合,这些集合将返回数据集交集中所有元素的列表。

set_1 = set(set_1)
set_2 = set(set_2)
duplicates = set1.intersection(set_2)

然而,还有一件事我需要做。重复项应按照第2组的顺序排列。为什么? Well set 1有一堆数据示例和标签,我用它作为训练集,而set 2是我的测试集。但是,如果给定的示例是重复的,我想从集合1中的相同示例中分配标签,而不是预测标签。

所以在伪代码中:你们对我如何做到这一点有所了解吗?

duplicates = set_1.intersection(set_2)
for example in set_2:
    if example in duplicates:
        assign labels from set_1 to example
    else:
        predict the labels

修改

因为我的问题的第一部分可能令人困惑,所以伪代码实际上是我真正想要的。因此,如果您发现我对上述问题的解释令人困惑,请查看我的伪代码,了解我想要实现的内容:

伪代码

    duplicates = set_1.intersection(set_2)
    for example in set_2:
        if example in duplicates:
            assign labels from set_1 to example
        else:
            predict the labels

不幸的是,我现在必须走了,所以我无法立即回复任何评论,但当我回来时,我会回复。

更新

这是我实际代码的一部分: 首先,我将列车和测试集读入为pandas数据框对象,并将它们转换为numpy数组,以便我能够访问各个列。

 train = pd.read_csv(os.path.join(dir,"Train.csv"))
 test = pd.read_csv(os.path.join(dir,"Test.csv"))

#getting train and test sets and the labels 
 train = np.array(train)[:,2]                                              
 test = np.array(test)[:,2]
 labels = np.array(train)[:,3]

我的想法是获取重复项列表以检查测试示例是否重复,因此我将列车和测试集转换为集合以获取重复项。

train = set(train)
test = set(test)
duplicates = train.intersection(test)

从这一点来说,我不确定应该如何进行。我的目标是为重复样本分配标签,这些标签应来自火车组。所有其他样本应该由我的估算器(机器学习算法)分配标签。

简而言之:我正在使用的数据再次是文本文档。我在火车和测试装置中都有文本文档,我的火车组都为每个例子分配了标签。对于我的测试集中的每个副本,我需要在我的列车集中找到重复的示例,更确切地说,它是相应的标签。我需要将该标签分配给测试示例。我的测试集中的所有非重复项都应该通过我的机器学习算法预测。

1 个答案:

答案 0 :(得分:2)

好的,我已经编辑过,看看这或多或少是你所需要的:

set_1 = [["yes", 1], ["maybe", 1], ["never", 0], ["nopes", 0], ["si", 1]]
set_2 = ["of course", "yes", "always", "never", "no way", "no"]

def predict_label(item):
    return 2 # just to check which items got predicted

dset_1 = dict(set_1)

labeled_set_2 = [[item, dset_1.get(item, predict_label(item))] for item in set_2]
print labeled_set_2

这将按照您的要求保留set_2中的顺序。但请检查我对set_1和set_2结构的假设是否正确。

结果如下:

[['of course', 2], ['yes', 1], ['always', 2], ['never', 0], ['no way', 2], ['no', 2]]

此列表理解创建一个由对组成的新列表(此处列出,但如果您愿意,可以使用元组)。关键的想法是从set_1中创建一个字典,因此您可以使用字典get方法来确定密钥是否存在。通过使用get,如果密钥不存在,则该值将默认为predict_label(item)返回的值。因此列表理解将遍历set_2中的所有项目,并检查它们是否作为字典中的键存在。如果是,则该对中的第二项将是该项的字典条目的值。如果为假,则第二项将由predict_label(item)计算。

这个其他代码做同样的事情,在函数内部使用for循环而不是列表理解:

set_1 = [["yes", 1], ["maybe", 1], ["never", 0], ["nopes", 0], ["si", 1]]
set_2 = ["of course", "yes", "always", "never", "no way", "no"]

def predict_label(item):
    return 2 # just to check which items got predicted

def labeled_set(set1, set2):
    dset_1 = dict(set1)
    labeled_set_2 = []
    for item in set2:
        if item in dset_1.keys():
            labeled_set_2.append([item, dset_1[item]])
        else:
            labeled_set_2.append([item, predict_label(item)])
    return labeled_set_2

print labeled_set(set_1, set_2)

这给出了相同的结果。在这种情况下,我使用了dset_1.keys(),因此不需要使用get方法。