Проверка наличия подстрок из списка в Pandas Series
Быстрый ответ
Для того чтобы проверить, содержит ли строка одну из подстрок из списка в серии Pandas, необходимо создать регулярное выражение, используя этот список подстрок — ['substr1', 'substr2', ...]
— и применить к нему метод str.contains
:
import pandas as pd
# DataFrame с колонкой, которую нужно проверить
df = pd.DataFrame({'column': ['text1', 'text2', ...]})
# Список подстрок, которые мы ищем
substrings = ['substr1', 'substr2', ...]
# Регулярное выражение для поиска подстрок
df['matches'] = df['column'].str.contains('|'.join(substrings))
Если ваши подстроки включают специальные символы, воспользуйтесь функцией re.escape
для их экранирования:
import re
# Экранирование спецсимволов в подстроках
escaped_substrings = [re.escape(substring) for substring in substrings]
regex_pattern = '|'.join(escaped_substrings)
# Поиск включая специальные символы
df['matches'] = df['column'].str.contains(regex_pattern)
Поиск подстрок: инструкция для детектива
Рассмотрим различные методы поиска подстрок:
Игнорирование регистра
Для осуществления поиска, независимого от регистра символов, используйте параметр case
:
# Поиск без учёта регистра
df['matches'] = df['column'].str.contains(regex_pattern, case=False)
Работа с пропущенными значениями
Если в данных есть пропущенные значения NaN
, определите их обработку с помощью параметра na
:
# Обработка пропущенных значений при поиске
df['matches'] = df['column'].str.contains(regex_pattern, na=False)
Борьба с ложными срабатываниями
Для исключения ложных срабатываний, например слова 'pet', используйте просмотр вперёд с отрицанием:
# Исключаем ложные срабатывания
regex_pattern = r'(?<!pet)' + regex_pattern
df['matches'] = df['column'].str.contains(regex_pattern)
Уловки детектива от Pandas: от новичка до профессионала
Pandas предлагает разнообразные подходы к поиску:
Lambda: для тонких настроек
Воспользуйтесь лямбда-функцией и apply
для решения нетривиальных задач:
# Использование лямбда-выражения для поиска подстрок
df['matches'] = df['column'].apply(lambda x: any(sub in x for sub in substrings))
Бинарное хранение результатов
Сохраните результат поиска в бинарном виде:
# Конвертация результатов в бинарный формат
df['matches'] = df['column'].str.contains(regex_pattern).astype(int)
Использование 're.compile' для компиляции регулярных выражений
Компилируйте сложные регулярные выражения с помощью re.compile
:
# Применение скомпилированного регулярного выражения
pattern = re.compile(regex_pattern)
df['matches'] = df['column'].str.contains(pattern)
Визуализация
В этом разделе мы представляем наглядный пример работы str.contains
в Pandas, аналогично процессу отбора актёров для роли в драме:
Сцена: "Быстрая коричневая лиса"
Актёры: ["лиса", "собака", "кот"]
Поиск проходим следующим образом:
script = '|'.join(substrings)
df['text'].str.contains(script)
Результаты отбора:
Результат кастинга: [👎, 👎,👎, 👍]
Тут True
(👍) означает, что подстрока найдена, а False
(👎) – что поиск неуспешен.
Наука об обнаружении
Pandas предоставляет следующие инструменты для работы с данными, аналогично инструментам детектива:
.str.contains()
: фиксирует совпадения с подстроками.'|'
: объединяет несколько условий поиска.re.escape()
: предотвращает непредвиденные эффекты от специальных символов.apply
иlambda
: позволяют проводить сложные поисковые операции.
Создание улучшенных запросов
Следующие методы помогут повысить эффективность поиска:
Точный поиск с исключениями
Сократите результаты поиска, исключив нежелательные совпадения:
# Исключение ненужных совпадений
regex_pattern = r'^(?!.*(unwanted1|unwanted2)).*'
df['matches'] = df['column'].str.contains(regex_pattern)
Масштабирование с помощью сторонних ресурсов
Для улучшения производительности и гибкости используйте стороннюю библиотеку regex
:
import regex
# Улучшенный поиск с помощью regex.search()
df['matches'] = df['column'].apply(lambda x: bool(regex.search(regex_pattern, x)))
Извлечение соответствующих фрагментов
Метод str.extract
поможет найти и извлечь искомые подстроки:
# Извлекаем подстроки
df['extracted_substring'] = df['column'].str.extract(f'({regex_pattern})')
Полезные материалы:
- pandas.Series.str.contains — документация по методу
str.contains
. - Как проверить, является ли строка подстрокой? — обсуждение на Stack Overflow.
- pandas.DataFrame.query — документация по методу
query
. - re — Регулярные выражения — руководство по регулярным выражениям в Python.
- Индексирование и выбор данных — информация о методах индексирования в Pandas.
- Индексация и выбор данных — глава из руководства Python Data Science Handbook.
- pandas.DataFrame.any — метод
.any()
в Pandas API.