← К списку уроков
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)