我的数据看起来像:
Identifier Category1 Category2 Category3 Category4 Category5
1000 foo bat 678 a.x ld
1000 foo bat 78 l.o op
1000 coo cat 678 p.o kt
1001 coo sat 89 a.x hd
1001 foo bat 78 l.o op
1002 foo bat 678 a.x ld
1002 foo bat 78 l.o op
1002 coo cat 678 p.o kt
我想做的是将 1000 与 1001 和 1002 进行比较,依此类推。我希望代码给出的输出是:1000 与 1002 相同。因此,我想要使用的方法是:
- 首先将所有标识符项分组到单独的数据帧中(也许?)。例如,df1 将是与标识符 1000 相关的所有行,df2 将是与标识符 1002 相关的所有行。(**请注意,我希望代码自己执行此操作,因为有数百万行,而不是我编写代码手动比较标识符**)。我尝试过使用 pandas 的 groupby 功能,它很好地完成了分组部分,但我不知道如何比较组。
- 比较每个组/子数据帧。
我想到的一种方法是将特定标识符的每一行读取到数组/向量中,并使用比较度量(曼哈顿距离、余弦相似度等)来比较数组/向量。
感谢任何帮助,我对 Python 很陌生。提前致谢!
您可以执行以下操作:
import pandas as pd
input_file = pd.read_csv("input.csv")
columns = ['Category1','Category2','Category3','Category4','Category5']
duplicate_entries = {}
for group in input_file.groupby('Identifier'):
# transforming to tuples so that it can be used as keys on a dict
lines = [tuple(y) for y in group[1].loc[:,columns].values.tolist()]
key = tuple(lines)
if key not in duplicate_entries:
duplicate_entries[key] = []
duplicate_entries[key].append(group[0])
然后duplicate_entries
值将包含重复标识符的列表
duplicate_entries.values()
> [[1000, 1002], [1001]]
EDIT:
要仅获取具有重复项的条目,您可以使用以下内容:
all_dup = [dup for dup in duplicate_entries if len(dup) > 1]
解释一下索引(抱歉我之前没有解释):迭代通过df.groupby
结果给出一个元组,其中第一个条目是组的键(在本例中它将是“标识符”),第二个条目是一系列分组数据帧。因此,为了获取包含重复条目的行,我们将使用[1]
该组的“标识符”位于[0]
。因为在duplicate_entries
数组我们想要该条目的标识符,使用group[0]
会让我们得到那个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)