S.k*_*k.S 5 python dataframe pandas
我有看起来像的数据:
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
Run Code Online (Sandbox Code Playgroud)
我想做的是比较1000与1001和1002,依此类推。我希望代码提供的输出是:1000与1002相同。因此,我想使用的方法是:
我想到的一种方法是将特定标识符的每一行读入数组/向量,并使用比较度量(曼哈顿距离,余弦相似度等)比较数组/向量。
感谢您的任何帮助,我对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])
Run Code Online (Sandbox Code Playgroud)
然后这些duplicate_entries值将具有重复标识符的列表
duplicate_entries.values()
> [[1000, 1002], [1001]]
Run Code Online (Sandbox Code Playgroud)
编辑:
要仅获取具有重复项的条目,您可以使用以下内容:
all_dup = [dup for dup in duplicate_entries if len(dup) > 1]
Run Code Online (Sandbox Code Playgroud)
解释索引(抱歉我之前没有解释):迭代结果df.groupby给出一个元组,其中第一个条目是组的键(在本例中它将是一个“标识符”),第二个条目是一个系列分组数据帧的。因此,要获取包含我们要使用的重复条目的行[1],并且该组的“标识符”可在 中找到[0]。因为在duplicate_entries数组上我们想要该条目的标识符,所以使用group[0]可以得到它。