Python·Лёгкий·8 мин
Работа со строками: очистка и нормализация
str.strip, str.lower, str.replace, регулярные выражения — приведение текста к чистому виду.
Работа со строками в pandas
Очистка текста — 20% работы аналитика. Email с пробелами, телефоны разных форматов, опечатки в категориях — всё это надо нормализовать перед анализом.
Доступ к строковым методам
Через аксессор .str:
df['email'].str.lower()
df['name'].str.strip()
df['phone'].str.replace('-', '')
Базовые операции
# Регистр
df['email'].str.lower() # 'JOHN@X.com' → 'john@x.com'
df['city'].str.title() # 'аЛМАТЫ' → 'Алматы'
df['code'].str.upper() # 'kz' → 'KZ'
# Обрезка пробелов
df['name'].str.strip() # удалить ведущие/висящие пробелы
df['name'].str.lstrip() # только слева
df['name'].str.rstrip() # только справа
# Проверки
df['email'].str.contains('@') # содержит @
df['email'].str.startswith('a') # начинается с a
df['email'].str.endswith('.kz') # заканчивается .kz
# Длина
df['name'].str.len() # длина строки
Замены
# Простая замена
df['phone'].str.replace('-', '')
df['phone'].str.replace(' ', '')
# Регулярные выражения (regex=True)
df['phone'].str.replace(r'\D', '', regex=True) # удалить всё кроме цифр
df['name'].str.replace(r'\s+', ' ', regex=True) # схлопнуть множественные пробелы
Разбиение и извлечение
# Разбить по разделителю
df['name'].str.split(' ') # список
df['name'].str.split(' ', expand=True) # DataFrame: колонки 0, 1, 2
# Достать первое имя
df['first_name'] = df['name'].str.split(' ').str[0]
# Извлечь домен из email
df['domain'] = df['email'].str.extract(r'@(.+)$')
# Найти всё что подходит
df['hashtags'] = df['text'].str.findall(r'#\w+')
Полный пример очистки email
df['email_clean'] = (
df['email']
.str.strip() # обрезать пробелы
.str.lower() # в нижний регистр
.str.replace(r'\s+', '', regex=True) # удалить пробелы внутри
)
# Валидация
valid = df['email_clean'].str.match(r'^[^@\s]+@[^@\s]+\.[^@\s]+$')
df = df[valid]
Что важно запомнить
.strметоды работают с NaN — возвращают NaN, не падают- Цепочки
.str.X().str.Y()— pandas-стиль. Читается слева направо - Для regex — обязательно
regex=Trueили будет deprecation warning - На больших данных string-операции тормозят. Vectorized regex быстрее чем
.apply(lambda)