Короткий ответ
Поиск по тексту делают через df['col'].str.contains(pattern) или str.extract(regex) для извлечения части строки по регулярному выражению, при этом параметр na=... нужно задать явно, чтобы контролировать поведение на пропущенных значениях.
Как это работает подробнее
str.contains возвращает булев Series, True если совпадение найдено; по умолчанию результат для NaN-значения в исходном столбце тоже становится NaN (не True и не False), что при использовании в качестве фильтра может привести к неожиданному исключению строк; str.extract с группами регулярного выражения возвращает DataFrame с извлечёнными частями или NaN, если совпадение не найдено.
Пример кода
question-131.py
import pandas as pd
df = pd.DataFrame({'email': ['user@test.com', None, 'another@company.ru']})
has_ru = df['email'].str.contains(r'\.ru$', na=False, regex=True)
print(has_ru)Что использовать на практике
- Практика. для надёжной фильтрации обычно явно указывают na=False в str.contains, чтобы пропуски трактовались как "не найдено", а не терялись в промежуточном NaN; регулярные выражения стоит тестировать отдельно на выборке строк, прежде чем применять к полному столбцу, особенно если паттерн сложный.
- Проверка. результат должен быть [False, False, True] — пропуск корректно трактуется как False благодаря na=False, а не вызывает ошибку при дальнейшей фильтрации.
Подводные камни
- Частая ошибка. используют df[df['col'].str.contains('x')] без na=False на столбце с пропусками и получают ValueError при попытке использовать результат как булеву маску; забывают экранировать специальные символы регулярных выражений (точку, скобки) при поиске буквальной подстроки, получая неверные совпадения.