use*_*543 5 python similarity set dataframe pandas
我有这个数据集:
import pandas as pd
import itertools
A = ['A','B','C']
M = ['1','2','3']
F = ['plus','minus','square']
df = pd.DataFrame(list(itertools.product(A,M,F)), columns=['A','M','F'])
print(df)
Run Code Online (Sandbox Code Playgroud)
示例输出如下:
A M F
0 A 1 plus
1 A 1 minus
2 A 1 square
3 A 2 plus
4 A 2 minus
5 A 2 square
Run Code Online (Sandbox Code Playgroud)
我想对该数据帧中的每一行进行成对比较(杰卡德相似度),例如,比较
A 1 plus并A 2 square得到这两个集合之间的相似度值。
我写了一个jaccard函数:
def jaccard(a, b):
c = a.intersection(b)
return float(len(c)) / (len(a) + len(b) - len(c))
Run Code Online (Sandbox Code Playgroud)
这只能在现场工作,因为我用过intersection
我想要这样的输出(这个预期结果值只是随机数):
0 1 2 3 45
0 1.00 0.43 0.61 0.55 0.46
1 0.43 1.00 0.52 0.56 0.49
2 0.61 0.52 1.00 0.48 0.53
3 0.55 0.56 0.48 1.00 0.49
45 0.46 0.49 0.53 0.49 1.00
Run Code Online (Sandbox Code Playgroud)
获得成对指标结果的最佳方法是什么?
谢谢你,
您可以在这里找到您想要的完整实现:
series_set = df.apply(frozenset, axis=1)
new_df = series_set.apply(lambda a: series_set.apply(lambda b: jaccard(a,b)))
Run Code Online (Sandbox Code Playgroud)