Текстовые столбцы: нормализация и разбор через .str
Содержание курса
Разбивка строк через .str.split и извлечение подстрок
Нормализация приводит строки к единому виду, но иногда нужно пойти дальше — разрезать строку на части и положить каждую в отдельный столбец. Именно это делает .str.split.
Базовый вызов принимает строку-разделитель и возвращает Series, где каждый элемент — список подстрок:
import pandas as pd
s = pd.Series(['Иван Петров', 'Анна Смирнова', 'Дмитрий Орлов'])
print(s.str.split(' '))
# 0 [Иван, Петров]
# 1 [Анна, Смирнова]
# 2 [Дмитрий, Орлов]
# dtype: object
Списки внутри Series неудобны для дальнейшей работы. Чтобы сразу получить нормальный DataFrame с отдельными столбцами, передаём expand=True:
split_df = s.str.split(' ', expand=True)
print(split_df)
# 0 1
# 0 Иван Петров
# 1 Анна Смирнова
# 2 Дмитрий Орлов
Столбцы получают целочисленные имена — 0, 1, 2 и так далее. Их сразу можно присвоить обратно в таблицу:
df = pd.DataFrame({'full_name': ['Иван Петров', 'Анна Смирнова', 'Дмитрий Орлов']})
split_df = df['full_name'].str.split(' ', expand=True)
df['first'] = split_df[0]
df['last'] = split_df[1]
print(df)
# full_name first last
# 0 Иван Петров Иван Петров
# 1 Анна Смирнова Анна Смирнова
# 2 Дмитрий Орлов Дмитрий Орлов
Параметр n ограничивает максимальное число разбиений. Это полезно, когда разделитель может встречаться несколько раз, а нужно отрезать только первую часть:
s2 = pd.Series(['2024-01-15', '2023-12-03', '2024-07-22'])
split2 = s2.str.split('-', n=1, expand=True)
print(split2)
# 0 1
# 0 2024 01-15
# 1 2023 12-03
# 2 2024 07-22
С n=1 строка разбивается ровно один раз: до первого дефиса и всё остальное. Без n были бы три столбца.
Извлечение подстроки по позиции. Когда не нужно разбивать строку, а нужно вырезать конкретный диапазон символов, используют .str.slice(start, stop) или краткую форму — индексацию через .str[start:stop]:
s3 = pd.Series(['2024-01-15', '2023-12-03', '2024-07-22'])
print(s3.str.slice(0, 4)) # только год
# 0 2024
# 1 2023
# 2 2024
# dtype: object
print(s3.str[5:7]) # то же через краткую форму — месяц
# 0 01
# 1 12
# 2 07
# dtype: object
Обе формы эквивалентны. .str[i] без среза извлекает один символ по индексу — первый символ строки это .str[0].
Результат .str.split(expand=True) — полноценный DataFrame, с которым можно работать как с любой другой таблицей: переименовывать столбцы, фильтровать, склеивать обратно. Это основной способ структурировать «сжатые» данные, когда несколько значений хранятся в одной ячейке через разделитель.
