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

我有两个数据集,使用pandas DataFrame读取,分别称为数据集1和数据集2。这两个数据集包含文本文档。数据集1中的一些文本文档也出现在数据集2中,我正在寻找一种方法来查找这些重复项。我最初考虑使用集合,这将返回数据集交集中的所有元素列表。

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

然而,我还需要做一件事。重复项应该按照数据集2的顺序排列。为什么呢?因为数据集1包含许多数据示例和标签,我将其用作训练集,而数据集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

编辑

由于我的问题第一部分可能有些 confusing,伪代码实际上是我真正想要的。所以如果你觉得我对问题的解释有些 confusing,只需查看我的伪代码以了解我想实现的目标总结:

伪代码

    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"))#获取训练集和测试集以及标签  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)

从这一点开始,我不确定应该如何继续。我的目标是为重复样本分配标签,这些标签应该来自训练集。所有其他样本应该由我的估算器(机器学习算法)分配标签。

简而言之:我处理的数据是文本文档。我有在训练集和测试集中都出现的文本文档,我的训练集为每个示例分配了标签。对于测试集中的每个重复项,我需要在训练集中找到该重复示例,并更具体地说是其对应的标签。我需要将该标签分配给测试示例。测试集中的所有非重复项应由我的机器学习算法预测。


回答:

好的,我已经编辑过了,看看这是否更接近你需要的:

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 # 只是为了检查哪些项目被预测了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 # 只是为了检查哪些项目被预测了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_2print labeled_set(set_1, set_2)

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注