Векторизованный поиск строки в фрейме данных - PullRequest
2 голосов
/ 19 июня 2020

Я столкнулся с проблемой, которую не могу решить. Выполнили обязательный поиск в Google и не смогли найти подходящего решения. Это может быть просто (на это я надеюсь):

У меня есть Python dataframe (case_content) со следующими 4 столбцами. case_content = case_content[[‘CASE_NUMBER','CASE_HEADLINE','CASE_DESCRIPTION','wordFound']] Последний столбец (wordFound) пуст.

Затем у меня есть список ключевых слов (называемых StringOne - StringTen): wordList =[*'StringOne','StringTwo','StringThree','StringFour','StringFive','StringSix','StringSeven','StringSix','StringSeven','StringEight','StringNine','StringTen'*]

В моем dataFrame я хочу для поиска в каждом поле CASE_DESCRIPTION в каждой строке, чтобы увидеть, присутствует ли одно из ключевых слов из WordList. Для этого я использую строку ниже: case_content.loc[case_content['CASE_DESCRIPTION'].str.contains('|'.join(wordList)), 'wordFound'] = 'match found in description'

Как видите, я назначаю стандартную строку ' совпадение, найденное в описании ' в столбце wordFound, если совпадение найдено в CASE_DESCRIPTION столбец. Кажется, это нормально работает. При выполнении print(case_content) я получаю результат, похожий на этот:

   CASE_NUMBER       CASE_HEADLINE      CASE_DESCRIPTION             wordFound
     345             [title here]     [Description here]     match found in description
     644             [title here]     [Description here]     match found in description
     765             [title here]     [Description here]     match found in description
     803             [title here]     [Description here]     match found in description

Однако на самом деле я хочу получить, это добавить определенные c совпадающие слова (разделенные запятой), в wordFound colomn, - вот так:

CASE_NUMBER          CASE_HEADLINE      CASE_DESCRIPTION             wordFound
     345             [title here]     [Description here]     StringTwo, StringFour, StringSix
     644             [title here]     [Description here]     StringTwo, StringTen
     765             [title here]     [Description here]     StringThree, StringSeven
     803             [title here]     [Description here]     StringFive, StringEight, StringNine 

На самом деле я разработал решение ранее, используя вложенный подход iterows (), где я бы перебирал фрейм данных, а затем для каждой строки перебирал каждое слово, чтобы посмотрите, есть ли совпадение в каждом CASE_DESCRIPTION. Затем внутри l oop я добавил ключевое слово (а) возможного соответствия в столбец wordFound (разделенный запятой). Однако этот подход был более или менее бесполезен, поскольку мой dataFrame имеет длину более 20 000 строк, а поле Description может содержать, возможно, 500 слов или более. Таким образом, с циклическим подходом на прохождение всего потребуется около +10 минут.

С подходом str.contains () кажется, что я могу пройти все за 5-10 секунд. что абсолютно приемлемо в моем случае использования. Мне просто нужно выяснить, как добавить фактически найденные слова вместо стандартного предложения, как описано.

Надеюсь, что кто-то может мне помочь.

Заранее спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...