Python 如何在数据集中查找和排序重复项
我有两个数据集,我用pandas Dataframe读入。让我们把它们称为集合1和集合2。集合1和集合2包含文本文档。集合1中的一些文本文档出现在集合2中,我正在寻找一种方法来查找那些重复的文档。我首先考虑使用集合,它将返回数据集合交集中所有元素的列表Python 如何在数据集中查找和排序重复项,python,pandas,machine-learning,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_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)
从这一点上说,我不确定该如何进行。我的目标是为重复的样本分配标签,这些标签应该来自火车组。所有其他样本都应该得到我的估计器(机器学习算法)指定的标签
简而言之,我处理的数据还是文本文档。我有文本文档出现在训练集和测试集中,我的训练集为每个例子都指定了标签。对于测试集中的每个副本,我需要在我的训练集中找到副本示例,更准确地说,它是对应的标签。我需要将该标签指定给测试示例。我的测试集中的所有非重复项都应该通过我的机器学习算法进行预测 好的,我已经编辑过了,看看这是否是您所需要的:
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
这将按照您的要求保留集合2中的顺序。但是请检查我对集合1和集合2的结构的假设是否正确
其结果是:
[['of course', 2], ['yes', 1], ['always', 2], ['never', 0], ['no way', 2], ['no', 2]]
此列表理解创建了一个由对组成的新列表(此处列出,但如果愿意,可以使用元组)。关键的想法是从集合_1中生成一个字典,因此您可以使用dictionaryget
方法来确定键是否存在。通过使用get
,如果键不存在,该值将默认为predict\u label(item)
返回的值。因此,列表理解将遍历集合2中的所有项,并检查它们是否作为键存在于词典中。如果是,则该对中的第二项将是该项的字典条目的值。如果为false,则第二项将由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方法。我并不特别了解Panda,我可以将
set_1
和set_2
视为我答案中的字符串列表吗?我对您将标签从set1分配到example
的示例感到困惑。。。例如,set2中的项目,所以您要将set1中的标签分配给set1中的每个项目?那么set1是由iterables组成的?我的第一部分问题有点让人困惑,但我真正想要的是伪代码行。我回来后会添加它。我再试了一次,但请检查我对set_1
和set_2
结构的假设是否正确。这不是我想要的。我会加上exratr解释。我对列表理解有点困惑。对于集合_2中的每个项目,它从集合_1中获取相应的标签?我说的对吗?不管怎样,根据我从您的代码中了解的情况,它将集合2中的每个项目替换为集合1中的项目和标签。如果set_2只包含重复项,但也包含非重复项,则这将起作用。我可能完全误解了你的代码,如果是这样,请纠正我。代码也会捕获非重复项。我要补充一个解释!啊,这看起来很有希望!