Я использую соотношение difflib для вычисления подобия между 2 строками:Векторизованное/Матричные вычисления между 2 панды dataframe столбцы
ratio = difflib.SequenceMatcher(None, 'string1', 'string2').ratio()
Выход одно значение с плавающей точкой 0-1, которое можно интерпретировать как счет матча.
То, что я пытаюсь сделать, это создать столбец, который содержит наилучшее соответствие на основе max(ratio)
между значением и списком других значений.
Так что если:
df.col1 = 'maria','fred','john'
и:
df2.col1 = 'mary','orange','maria'
df.bestmatch
будет содержать наиболее подходящий для 'maria', 'fred' and 'john'
на основе df2.col1
значений.
Я чувствую, что это возможно с использованием метода .apply
, но я просто не могу обернуть вокруг себя, как рассчитать каждое значение в df.col1
против df2.col1
.
ОБНОВЛЕНИЕ: метод difflib.get_close_matches смог обработать большие массивы намного лучше и дал мне все, что я хотел, за исключением оценки отношения (не большое дело). Ответ Тома ниже работал для меньших наборов данных, но получил MemoryError, когда каждый столбец был ~ 19 000 значений.
Эй, Том, это меня подводит, но то, что мне нужно, - это значение col2 с самым высоким коэффициентом. Так, например, maria будет оцениваться против mary, orange, maria и sam, а затем, основываясь на коэффициенте отношения, maria будет возвращена. Следующий fred будет оцениваться по тем же значениям, и значение с наивысшим результатом будет возвращено и так далее. Имеет ли это смысл? Вероятно, это можно сделать с некоторыми уродливыми вложенными для циклов, но я надеюсь на более элегантное/эффективное решение. – ChrisArmstrong
Ничего себе, это довольно сложно. Нет ли более простого способа? Я чувствую себя некомфортно, используя код, где я не понимаю 90% того, что происходит ... – ChrisArmstrong
Просто добавил некоторые комментарии. Надеюсь, они помогут! Возможно, будет более простой способ, но когда вы нарушаете проблему, я думаю, что все здесь необходимо. Сначала создайте список всех совпадений ('combos'). Затем разбейте этот список по имени из 'df.col1' (' groups'). Наконец, получите имя и соотношение, которое наилучшим образом подходит для каждого имени ('get_best'). строка '[173]' может быть выполнена с помощью 'df.col1.apply (get_best)'. – TomAugspurger