Выбор строк информационного кадра, которые содержат все строки из списка поисковых терминов, с использованием str.contains - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть Pandads Dataframe, где один столбец («обработан») - это отдельная строка, содержащая некоторый предварительно обработанный текст различной длины.

Я хочу выполнить поиск по списку ключевых слов произвольной длины, чтобы вернуть только обработанные заметки для строк, в которых строка «обработано» содержит ВСЕ элементы в списке.

Конечно, я могу искать термины по отдельности, например:

words = ['searchterm1', 'searchterm2']
notes = df.loc[(df.processed.str.contains(words[0])) & (df.processed.str.contains(words[1]))].processed

Но это кажется неэффективным и потребует другого кода в зависимости от количества поисковых запросов, которые я использую.

Я ищу что-то вроде ....

notes = (df.loc[[(df.processed.str.contains(words[i])) for i in range(len(words))]]).processed

Что будет включать

"searchterm1 foo bar searchterm"

но НЕ включает

"foo bar searchterm1"

или

"searchterm2".

Но это не работает - loc не поддерживает объект-генератор или список в качестве входных данных.

Так каков наилучший способ найти строку, содержащую несколько подстрок? Спасибо!

1 Ответ

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

Пример данных:

df = pd.DataFrame(data=[[1,'a', 3],
                   [1,'b', 4],
                   [2,'c', 22],
                   [2,'s', 3],
                   [2,'f', 3],
                   [1,'d', 56]], 
             columns = ['group', 'value', 'value2'])

words = ['two', 'three', 'two']

Вывод:

  processed
0       one
1       two
2     three
3   one one
4  two, one

Я изменяю ваш код raw:

notes = df.loc[sum([df.processed.str.contains(word) for word in words]) > 0]

Вывод:

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