Проверка наличия подстрок из списка в Pandas Series

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы проверить, содержит ли строка одну из подстрок из списка в серии Pandas, необходимо создать регулярное выражение, используя этот список подстрок — ['substr1', 'substr2', ...] — и применить к нему метод str.contains:

Python
Скопировать код
import pandas as pd

# DataFrame с колонкой, которую нужно проверить
df = pd.DataFrame({'column': ['text1', 'text2', ...]})

# Список подстрок, которые мы ищем
substrings = ['substr1', 'substr2', ...]

# Регулярное выражение для поиска подстрок
df['matches'] = df['column'].str.contains('|'.join(substrings))

Если ваши подстроки включают специальные символы, воспользуйтесь функцией re.escape для их экранирования:

Python
Скопировать код
import re

# Экранирование спецсимволов в подстроках
escaped_substrings = [re.escape(substring) for substring in substrings]
regex_pattern = '|'.join(escaped_substrings)

# Поиск включая специальные символы
df['matches'] = df['column'].str.contains(regex_pattern)
Кинга Идем в IT: пошаговый план для смены профессии

Поиск подстрок: инструкция для детектива

Рассмотрим различные методы поиска подстрок:

Игнорирование регистра

Для осуществления поиска, независимого от регистра символов, используйте параметр case:

Python
Скопировать код
# Поиск без учёта регистра
df['matches'] = df['column'].str.contains(regex_pattern, case=False)

Работа с пропущенными значениями

Если в данных есть пропущенные значения NaN, определите их обработку с помощью параметра na:

Python
Скопировать код
# Обработка пропущенных значений при поиске
df['matches'] = df['column'].str.contains(regex_pattern, na=False)

Борьба с ложными срабатываниями

Для исключения ложных срабатываний, например слова 'pet', используйте просмотр вперёд с отрицанием:

Python
Скопировать код
# Исключаем ложные срабатывания
regex_pattern = r'(?<!pet)' + regex_pattern
df['matches'] = df['column'].str.contains(regex_pattern)

Уловки детектива от Pandas: от новичка до профессионала

Pandas предлагает разнообразные подходы к поиску:

Lambda: для тонких настроек

Воспользуйтесь лямбда-функцией и apply для решения нетривиальных задач:

Python
Скопировать код
# Использование лямбда-выражения для поиска подстрок
df['matches'] = df['column'].apply(lambda x: any(sub in x for sub in substrings))

Бинарное хранение результатов

Сохраните результат поиска в бинарном виде:

Python
Скопировать код
# Конвертация результатов в бинарный формат
df['matches'] = df['column'].str.contains(regex_pattern).astype(int)

Использование 're.compile' для компиляции регулярных выражений

Компилируйте сложные регулярные выражения с помощью re.compile:

Python
Скопировать код
# Применение скомпилированного регулярного выражения
pattern = re.compile(regex_pattern)
df['matches'] = df['column'].str.contains(pattern)

Визуализация

В этом разделе мы представляем наглядный пример работы str.contains в Pandas, аналогично процессу отбора актёров для роли в драме:

Markdown
Скопировать код
Сцена: "Быстрая коричневая лиса"
Актёры: ["лиса", "собака", "кот"]

Поиск проходим следующим образом:

Python
Скопировать код
script = '|'.join(substrings)  
df['text'].str.contains(script)

Результаты отбора:

Markdown
Скопировать код
Результат кастинга: [👎, 👎,👎, 👍]

Тут True (👍) означает, что подстрока найдена, а False (👎) – что поиск неуспешен.

Наука об обнаружении

Pandas предоставляет следующие инструменты для работы с данными, аналогично инструментам детектива:

  • .str.contains(): фиксирует совпадения с подстроками.
  • '|': объединяет несколько условий поиска.
  • re.escape(): предотвращает непредвиденные эффекты от специальных символов.
  • apply и lambda: позволяют проводить сложные поисковые операции.

Создание улучшенных запросов

Следующие методы помогут повысить эффективность поиска:

Точный поиск с исключениями

Сократите результаты поиска, исключив нежелательные совпадения:

Python
Скопировать код
# Исключение ненужных совпадений
regex_pattern = r'^(?!.*(unwanted1|unwanted2)).*'
df['matches'] = df['column'].str.contains(regex_pattern)

Масштабирование с помощью сторонних ресурсов

Для улучшения производительности и гибкости используйте стороннюю библиотеку regex:

Python
Скопировать код
import regex

# Улучшенный поиск с помощью regex.search()
df['matches'] = df['column'].apply(lambda x: bool(regex.search(regex_pattern, x)))

Извлечение соответствующих фрагментов

Метод str.extract поможет найти и извлечь искомые подстроки:

Python
Скопировать код
# Извлекаем подстроки
df['extracted_substring'] = df['column'].str.extract(f'({regex_pattern})')

Полезные материалы:

  1. pandas.Series.str.contains — документация по методу str.contains.
  2. Как проверить, является ли строка подстрокой? — обсуждение на Stack Overflow.
  3. pandas.DataFrame.query — документация по методу query.
  4. re — Регулярные выражения — руководство по регулярным выражениям в Python.
  5. Индексирование и выбор данных — информация о методах индексирования в Pandas.
  6. Индексация и выбор данных — глава из руководства Python Data Science Handbook.
  7. pandas.DataFrame.any — метод .any() в Pandas API.