Фильтрация фрейма данных pandas по точному совпадению слов

#regex #pandas

#регулярное выражение #pandas

Вопрос:

У меня есть следующий фрейм данных в pandas

           Date                             Title
58      March 2015        Data Visualization with JavaScript
63   December 2014          Eloquent JavaScript, 2nd Edition
90    October 2014             If Hemingway Wrote JavaScript
96   December 2014                       JavaScript for Kids
158  February 2014  Principles of Object-Oriented JavaScript
209  November 2005                          Wicked Cool Java
  

Я должен отфильтровать строки, в которых содержится слово JavaScript. Я делаю следующее.

 category_javascript = np.where(Publisher['Title'].str.contains(r'(?:s|^)JavaScript(?:s|$)'))
  

Это дает мне следующий результат

 category_javascript
Out[106]: (array([ 58,  90,  96, 158], dtype=int64),)
  

63 December 2014 Eloquent JavaScript, 2nd Edition Я думаю, он не фильтрует, потому что слово JavaScript имеет запятую после него. Я хочу найти точное слово независимо от знаков препинания или комбинации. например, JavaScript-Book также подойдет.

Пожалуйста, помогите

Ответ №1:

IIUC вам не нужно регулярное выражение, только строка JavaScript :

 category_javascript = np.where(Publisher['Title'].str.contains('JavaScript'))
  

 print (Publisher['Title'].str.contains('JavaScript'))
58      True
63      True
90      True
96      True
158     True
209    False
Name: Title, dtype: bool

print (Publisher[Publisher['Title'].str.contains('JavaScript')])
              Date                                     Title
58      March 2015        Data Visualization with JavaScript
63   December 2014          Eloquent JavaScript, 2nd Edition
90    October 2014             If Hemingway Wrote JavaScript
96   December 2014                       JavaScript for Kids
158  February 2014  Principles of Object-Oriented JavaScript
  

Вы можете добавить диакритические знаки в регулярное выражение, например [,;] :

 print (Publisher['Title'].str.contains('(?:s|^|[,;])JavaScript(?:s|$|[,;])'))
58      True
63      True
90      True
96      True
158     True
209    False
Name: Title, dtype: bool

print (Publisher['Title'].str.contains('(?:s|^|[,;])Java(?:s|$|[,;])'))
58     False
63     False
90     False
96     False
158    False
209     True
Name: Title, dtype: bool
  

Комментарии:

1. Я понял вашу точку зрения. что, если я хочу извлечь word Java? Затем приведенный выше код вернет все строки, включая JavaScript

2. Вы поняли, что я говорю?

3. Да, дайте мне секунду

4. Работает идеально. Большое спасибо 🙂