pandalar: başka bir sütundaki değere göre her satır için jak kartı benzerliğini hesaplayın

Dec 15 2020

Aşağıdaki gibi, yalnızca daha fazla satır içeren bir veri çerçevem ​​var:

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'])

Jak kart benzerliğini hesaplamak için bu parçayı çevrimiçi buldum (benim çözümüm değil):

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

Sonuç olarak elde etmek istediğim şey, ölçünün İkinci sütunun her satırını doc olarak alması ve her çifti yinelemeli olarak karşılaştırması ve İlk sütundaki satır adıyla bir hesaplama çıkarması şuna benzer:

First value and Second value = 80 

First value and Third value  = 95

Second value and Third value = 90

Yanıtlar

AmitAmola Dec 15 2020 at 23:04

Pekala, bunu biraz şöyle yapardım

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}")

Çıktı:

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

Verileriniz büyük olmadığından, biraz farklı bir yaklaşımla yayın yapmayı deneyebilirsiniz:

# 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

Çıktı:

array([[100.        ,  33.33333333,  14.28571429],
       [ 33.33333333, 100.        ,  14.28571429],
       [ 14.28571429,  14.28571429, 100.        ]])