Поиск точного слова в столбце строк из списка слов с пробелами между ними

Я хочу создать новый столбец с 1 или 0, если какое-либо из слов в списке совпадает точно со столбцом строки фрейма данных.

Слова в списке могут иметь несколько пробелов между ними., поэтому я не могу использовать str.split () для точного совпадения.

list_provided=["mul the","a b c"]
#how my dataframe looks
id  text
a    simultaneous there the
b    simultaneous there
c    mul why the
d    mul the
e    simul a b c
f    a c b

Ожидаемый результат

id  text                      found
a    simultaneous there the    0
b    simultaneous there        0
c    mul why the               0
d    mul the                   1
e    simul a b c               1 
f    a c b                     0

Порядок слов в элементе списка также имеет значение !!

Код пробовал до сих пор

data=pd.DataFrame({"id":("a","b","c","d","e","f"), "text":("simultaneous there the","simultaneous there","mul why the","mul the","simul a b c","a c b")})
list_of_word=["mul the","a b c"]
pattern = '|'.join(list_of_word)
data['found'] = data['text'].apply(lambda x: sum(i in list_of_test_2 for i in x.split()))
data['found']=np.where(data['found']>0,1,0)
data
###Output generated###
id  text                   found
a   simultaneous there the  0
b   simultaneous there      0
c   mul why the             0
d   mul the                 0
e   simul a b c             0
f   a c b                   0

Как получить ожидаемый результат, когда мне нужно искать точное совпадение слов из списка со строкой столбца фрейма данных с несколькими пробелами между ними?

0
0
128
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы были почти у цели, вы выполнили всю основную работу, теперь осталось только вызвать функцию верно, в данном случае str.contains.

data['found'] = data.text.str.contains(pattern).astype(int)
data

  id                    text  found
0  a  simultaneous there the      0
1  b      simultaneous there      0
2  c             mul why the      0
3  d                 mul the      1
4  e             simul a b c      1
5  f                   a c b      0

Если ваши шаблоны сами содержат регулярное выражение OR, попробуйте сначала экранировать их:

import re
pattern = '|'.join([re.escape(i) for i in list_of_word])

Вы можете добиться этого с помощью str.contains. Это тоже может занять регулярное выражение!

data['found'] = np.where(data['text'].str.contains(pattern),1,0)

Это то же самое, что и data.text.str.contains(pattern).astype(int), хотя я предпочитаю тип.

cs95 11.04.2018 13:28

Верно! Я увидел твой ответ только после того, как разместил свой

KBN 11.04.2018 13:29

Да, без проблем, просто делал (по общему признанию предвзятого) наблюдение ;-)

cs95 11.04.2018 13:29

Другие вопросы по теме