我有两个数据集,使用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方法。