Найти количество совпадений ключевых слов в столбце панд, который находится в списке - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть кадр данных pandas, который выглядит следующим образом:

Type        Keywords 
----        --------
Animal      [Pigeon, Bird, Raccoon, Dog, Cat]
Pet         [Dog, Cat, Hamster]
Pest        [Rat, Mouse, Raccoon, Pigeon]
Farm        [Chicken, Horse, Cow, Sheep]
Predator    [Wolf, Fox, Raccoon]

Допустим, у меня есть следующая строка:

input = "There is a dead rat and raccoon in my pool"

Учитывая, что я токенизирую строку и удаляю стоп-words так, чтобы он стал

input = [Dead, Rat, Raccoon, Pool]

Мне нужно пройти через каждую строку и найти строки, которые имеют наибольшее количество совпадений ключевых слов.В данном примере результаты будут выглядеть следующим образом:

Type        Keywords                            Matches
----        --------                            -------
Animal      [Pigeon, Bird, Raccoon, Dog, Cat]   1
Pet         [Dog, Cat, Hamster]                 0
Pest        [Rat, Mouse, Raccoon, Pigeon]       2
Farm        [Chicken, Horse, Cow, Sheep]        0
Predator    [Wolf, Fox, Raccoon]                1

Выходными данными будут первые три типа имен с наибольшим количеством совпадений.

В приведенном выше случаеТак как в категории «Пешт» наибольшее количество совпадений, она будет выбрана в качестве наибольшего совпадения.Дополнительно будут выбраны категории животных и хищников.Таким образом, порядок вывода будет таким:

output = [Pest, Animal, Predator]

Выполнить эту задачу с помощью вложенных циклов for легко, но, поскольку у меня есть тысячи таких строк, я ищу лучшее решение.(Кроме того, по какой-то причине я столкнулся с множеством ошибок при использовании не встроенных функций с пандами, возможно, это связано с векторизацией?)

Я посмотрел на функции groupby и isin, встроенные в пандах, нонасколько я могу судить, они не смогут получить меня к выводу, который я хочу (я не удивлюсь, если я ошибусь в этом предположении).

Затем я исследовал использование наборов и хэш-карт с пандами, но, к сожалению, мои знания в области кодирования и текущие способности еще не достаточны для создания твердого решения. Эта ссылка на StackOverflow , в частности, значительно приблизила меня к тому, что я хотел, хотя и не нашла имена трех самых подходящих строк.

Я был бы очень признателен за любую помощь или совет.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Не очень эффективно хранить списки в DataFrame и работать с ними, при этом мы можем использовать пересечение множеств здесь:

Настройка

s = set(['Dead', 'Rat', 'Raccoon', 'Pool'])

Теперь используем понимание списка (быстрее, чем apply):

out = df.assign(Matches=[len(set(el) & s) for el in df.Keywords])

<!- ->

       Type                           Keywords  Matches
0    Animal  [Pigeon, Bird, Raccoon, Dog, Cat]        1
1       Pet                [Dog, Cat, Hamster]        0
2      Pest      [Rat, Mouse, Raccoon, Pigeon]        2
3      Farm       [Chicken, Horse, Cow, Sheep]        0
4  Predator               [Wolf, Fox, Raccoon]        1

Чтобы найти три строки с наибольшим количеством совпадений:

out.loc[out.Matches.nlargest(3).index].Type.tolist()

['Pest', 'Animal', 'Predator']
0 голосов
/ 17 сентября 2018

Вы можете проверить isin

df['Matches']=pd.DataFrame(df.Keywords.values.tolist()).isin(s).sum(1)


df.loc[df['Matches']>0,'Type'].values.tolist()
...