У меня есть фрейм данных с почти 1 миллионом строк и столбцов, как показано ниже:
VIN Complaints Repairs Key
12234 Customer states engine issues yes 1
12234 Car wont start. Engine broke down no 2
12234 Vehicle battery was replaced yes 3
12231 Car shut down, battery problem no 4
12231 Cool and hot air coming from ac yes 5
12231 Issue with temperature moderator, ac replaced yes 6
12231 air conditioner not working fine no 7
Я хочу сгруппировать df по 'VIN' и сравнить попарно сходство текста 'Complaints' с первым 'yes' из 'Repairs'.
Например, группа 12234 VIN с первым значением Repairs в качестве «Yes» в этом примере «Проблемы с состоянием клиента» должна сравниваться с двумя другими жалобами той же группы VIN. (1,1) (1,2) (1,3) для группы VIN 12234 и (5,4) (5,5) (5,6) (5,7) для группы VIN 12231.
Желаемый вывод
VIN Complaints Repairs Key Text_distance
12234 Customer states engine issues yes 1 1
12234 Car wont start. Engine broke down no 2 1
12234 Vehicle battery was replaced yes 3 0
12231 Car shut down, battery problem no 4 0
12231 Cool and hot air coming from ac yes 5 1
12231 Issue with temperature moderator, ac replaced yes 6 1
12231 air conditioner not working fine no 7 1
Я попробовал приведенный ниже код, но не смог получить желаемый результат
from sklearn.metrics.pairwise import cosine_similarity
vectorizer = TfidfVectorizer()
trsfm = vectorizer.fit_transform(df['Complaints'])
df['Text_distance']= df.groupby('VIN').apply(lambda x: x.cosine_similarity(trsfm.values, trsfm.values[:, None]))
Как обойти это? Также, пожалуйста, предложите в моем сценарии, если Jaccard / jaro_distance / cosine / что-то еще более эффективно.