pandas: вычислить сходство jaccard для каждой строки на основе значения в другом столбце
Dec 15 2020
У меня есть следующий фрейм данных, только с большим количеством строк:
import pandas as pd
data = {'First': ['First value', 'Second value','Third value'],
'Second': [['old','new','gold','door'], ['old','view','bold','door'],['new','view','world','window']]}
df = pd.DataFrame (data, columns = ['First','Second'])
Чтобы рассчитать сходство жаккартов, я нашел в Интернете эту штуку (не мое решение):
def lexical_overlap(doc1, doc2):
words_doc1 = set(doc1)
words_doc2 = set(doc2)
intersection = words_doc1.intersection(words_doc2)
union = words_doc1.union(words_doc2)
return float(len(intersection)) / len(union) * 100
то, что я хотел бы получить в результате, - это чтобы мера принимала каждую строку второго столбца как документ и итеративно сравнивала каждую пару и выводила меру с именем строки из первого столбца примерно так:
First value and Second value = 80
First value and Third value = 95
Second value and Third value = 90
Ответы
AmitAmola Dec 15 2020 at 23:04
Ну, я бы сделал это примерно так:
from itertools import combinations
for val in list(combinations(range(len(df)), 2)):
firstlist = df.iloc[val[0],1]
secondlist = df.iloc[val[1],1]
value = round(lexical_overlap(firstlist,secondlist),2)
print(f"{df.iloc[val[0],0]} and {df.iloc[val[1],0]}'s value is: {value}")
Вывод:
First value and Second value's value is: 33.33
First value and Third value's value is: 14.29
Second value and Third value's value is: 14.29
1 QuangHoang Dec 15 2020 at 22:54
Поскольку ваши данные невелики, вы можете попробовать трансляцию с немного другим подходом:
# dummy for each rows
s = pd.get_dummies(df.Second.explode()).sum(level=0).values
# pair-wise jaccard
([email protected])/(s|s[:,None,:]).sum(-1) * 100
Вывод:
array([[100. , 33.33333333, 14.28571429],
[ 33.33333333, 100. , 14.28571429],
[ 14.28571429, 14.28571429, 100. ]])