pandas: типы столбцов и очистка по правилу

Текстовые столбцы: нормализация и разбор через .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, с которым можно работать как с любой другой таблицей: переименовывать столбцы, фильтровать, склеивать обратно. Это основной способ структурировать «сжатые» данные, когда несколько значений хранятся в одной ячейке через разделитель.