पांडा: प्रत्येक पंक्ति के लिए एक और कॉलम में मूल्य के आधार पर जैकार्डकार्ड समानता की गणना करें
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'])
Jaccard समानता की गणना करने के लिए मैंने इस टुकड़े को ऑनलाइन पाया (मेरे समाधान नहीं):
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. ]])