0Pricing
Pandas & NumPy Academy · Урок

Разделение и замена строк

Разделяйте строки на несколько столбцов с помощью .str.split(expand=True) и заменяйте подстроки с помощью .str.replace().

«Разделение и замена строк» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Разделение строк на список

.str.split(sep) разделяет каждую строку в Series при каждом вхождении разделителя и возвращает Series, состоящий из списков. Без expand=True каждый элемент является списком Python, что удобно для подсчёта токенов или дальнейшей обработки на уровне списков. Разделитель может быть буквальной строкой или шаблоном регулярного выражения.

import pandas as pd

df = pd.DataFrame({'tags': ['python,data,pandas', 'ml,ai', 'sql,db,query']})

# Split into a list of strings
df['tag_list'] = df['tags'].str.split(',')
print(df['tag_list'])
# 0    [python, data, pandas]
# 1                  [ml, ai]
# 2         [sql, db, query]

# Count tags per row
df['tag_count'] = df['tag_list'].str.len()
print(df['tag_count'].tolist())  # [3, 2, 3]

expand=True для разделения на столбцы

Передача expand=True в .str.split() возвращает DataFrame вместо Series списков: каждый выделенный токен становится отдельным столбцом (столбцы 0, 1, 2, …). Это стандартный способ расширить столбец с разделителями — например, разделить полное имя 'first last' на отдельные столбцы с именем и фамилией.

import pandas as pd

df = pd.DataFrame({'full_name': ['Alice Smith', 'Bob Jones', 'Carol White']})

# Split into two columns
name_parts = df['full_name'].str.split(' ', expand=True)
name_parts.columns = ['first_name', 'last_name']
df = pd.concat([df, name_parts], axis=1)
print(df)
#     full_name first_name last_name
# 0  Alice Smith      Alice     Smith
# 1    Bob Jones        Bob     Jones
# 2  Carol White      Carol     White

Ограничение числа разделений с помощью n=

Параметр n ограничивает максимальное число разделений. .str.split(sep, n=1) выполняет не более одного разделения, создавая не более двух частей. Это полезно, когда Вам нужен только первый компонент строки, а оставшуюся часть следует сохранить целиком — например, для извлечения домена из адреса электронной почты с помощью разделения по '@'.

import pandas as pd

df = pd.DataFrame({'email': ['alice@example.com', 'bob@work.org', 'carol@test.net']})

# Split at '@', keep only the first split
parts = df['email'].str.split('@', n=1, expand=True)
df['username'] = parts[0]
df['domain'] = parts[1]
print(df[['username', 'domain']])
#   username       domain
# 0    alice  example.com
# 1      bob     work.org
# 2    carol     test.net

rsplit() для разделения справа

.str.rsplit(sep, n=1) разбивает строку с правой стороны. Это полезно, когда нужно получить последний компонент — например, извлечь расширение файла из пути, выполнив разбиение по последней точке. В сочетании с expand=True метод создаёт два столбца: всё до последнего разделителя и всё после него.

import pandas as pd

df = pd.DataFrame({'filepath': ['data/raw/sales.csv', 'data/clean/orders.xlsx', 'reports/q1.pdf']})

# Split on the last '/' to separate directory from filename
parts = df['filepath'].str.rsplit('/', n=1, expand=True)
df['directory'] = parts[0]
df['filename'] = parts[1]
print(df[['directory', 'filename']])
#     directory    filename
# 0    data/raw   sales.csv
# 1  data/clean  orders.xlsx
# 2     reports       q1.pdf

.str.replace() для замены подстрок

.str.replace(pat, repl) заменяет вхождения шаблона в каждой строке. По умолчанию pat интерпретируется как регулярное выражение, поэтому для замены обычной строки передайте regex=False. Заменой может быть фиксированная строка или обратная ссылка регулярного выражения. Для векторизованной замены всегда используйте этот метод вместо цикла Python.

import pandas as pd

df = pd.DataFrame({'price': ['$1,200.50', '$800.00', '$3,450.75']})

# Remove dollar sign and commas
df['price_clean'] = (
    df['price']
    .str.replace('$', '', regex=False)  # literal $
    .str.replace(',', '', regex=False)  # literal comma
)
df['price_float'] = df['price_clean'].astype(float)
print(df)
#       price price_clean  price_float
# 0  $1,200.50    1200.50       1200.5
# 1    $800.00     800.00        800.0
# 2  $3,450.75    3450.75       3450.75

Замена с помощью шаблонов регулярных выражений

Если передать regex=True (значение по умолчанию), шаблон будет регулярным выражением, а замена сможет содержать обратные ссылки, например r'\1', для обращения к захваченным группам. Это позволяет выполнять сложные преобразования текста: изменять формат дат, нормализовать номера телефонов или извлекать структурированные данные из неструктурированного текста.

import pandas as pd

df = pd.DataFrame({'date': ['01-15-2024', '03-20-2024', '07-04-2024']})

# Reformat from MM-DD-YYYY to YYYY-MM-DD using groups
df['date_iso'] = df['date'].str.replace(
    r'(\d{2})-(\d{2})-(\d{4})',
    r'\3-\1-\2',
    regex=True
)
print(df)
#          date   date_iso
# 0  01-15-2024  2024-01-15
# 1  03-20-2024  2024-03-20
# 2  07-04-2024  2024-07-04

Подсчёт выполненных замен

Иногда необходимо проверить, сколько значений действительно изменилось после замены. Сравните исходный и изменённый Series, чтобы посчитать строки, в которых произошло изменение. Этот этап проверки подтверждает, что шаблон замены сработал ожидаемым образом, и помогает заранее обнаружить ошибки в регулярном выражении.

import pandas as pd

df = pd.DataFrame({'text': ['foo bar', 'hello foo', 'world', 'foo foo']})

original = df['text'].copy()
df['text'] = df['text'].str.replace('foo', 'baz', regex=False)

changed = (df['text'] != original).sum()
print(f'{changed} rows were modified')  # 3
print(df['text'].tolist())
# ['baz bar', 'hello baz', 'world', 'baz baz']

Замена нескольких шаблонов в цикле

Если нужно выполнить много замен (например, стандартизировать десятки сокращений), переберите словарь соответствий в цикле и последовательно примените каждую замену. Такой подход удобнее в сопровождении, чем одно сложное чередование в регулярном выражении. Создайте словарь на основе бизнес-правил или таблицы соответствий.

import pandas as pd

df = pd.DataFrame({'dept': ['Eng', 'Engg', 'HR', 'Human Resources', 'Mktg', 'Marketing']})

# Standardisation map
substitutions = {
    'Engg': 'Engineering',
    'Eng': 'Engineering',
    'Human Resources': 'HR',
    'Mktg': 'Marketing'
}

for old, new in substitutions.items():
    df['dept'] = df['dept'].str.replace(old, new, regex=False)

print(df['dept'].tolist())
# ['Engineering', 'Engineering', 'HR', 'HR', 'Marketing', 'Marketing']

Объединение разделённых частей

После разбиения может потребоваться снова объединить полученные части. Для Series, содержащего списки, используйте .str.join(separator), чтобы объединить элементы списка в одну строку для каждой строки. Для объединения значений из разных столбцов используйте обычное сложение строк с помощью + и .astype(str).

import pandas as pd

df = pd.DataFrame({'parts': [['alpha', 'beta'], ['foo', 'bar', 'baz']]})

# Join list elements with a hyphen
df['joined'] = df['parts'].str.join('-')
print(df['joined'])
# 0     alpha-beta
# 1  foo-bar-baz

Нормализация пробелов

Одна из распространённых задач очистки текста — заменить несколько последовательных пробелов одним пробелом. Такое часто происходит в извлечённом из веб-страниц тексте, где HTML-разметка или копирование добавляют лишние пробельные символы. Шаблон регулярного выражения r'\s+' соответствует одному или нескольким пробельным символам и заменяет их одним пробелом, а затем .str.strip() удаляет пробелы в начале и конце.

import pandas as pd

df = pd.DataFrame({'address': ['123  Main   St', '  456 Oak  Ave  ', '789 Pine St']})

df['address_clean'] = (
    df['address']
    .str.replace(r'\s+', ' ', regex=True)
    .str.strip()
)
print(df['address_clean'].tolist())
# ['123 Main St', '456 Oak Ave', '789 Pine St']

Практика: разбор столбца со структурированными строками

Рассмотрим реалистичный пример: один столбец содержит структурированные данные, например 'Alice:25:Engineer'. Мы разделим строки по разделителю, зададим имена полученным столбцам и преобразуем каждый столбец в подходящий тип — полный конвейер разбора и преобразования типов, использующий только .str.split() и astype().

import pandas as pd

df = pd.DataFrame({'record': ['Alice:25:Engineer', 'Bob:34:Manager', 'Carol:28:Analyst']})

parts = df['record'].str.split(':', expand=True)
parts.columns = ['name', 'age', 'role']
parts['age'] = parts['age'].astype(int)

result = pd.concat([df, parts], axis=1)
print(result)
#              record   name  age      role
# 0  Alice:25:Engineer  Alice   25  Engineer
# 1    Bob:34:Manager    Bob   34   Manager
# 2  Carol:28:Analyst  Carol   28   Analyst

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете разбиение и замену строк.

Итоги урока

В этом уроке Вы узнали, что str.split(sep, expand=True) преобразует столбец с разделителями в несколько столбцов, n= ограничивает количество разбиений, str.rsplit() выполняет разбиение справа, а str.replace() заменяет шаблоны (с поддержкой регулярных выражений). Объединяйте операции разбиения и замены с strip и lower, чтобы создавать полноценные конвейеры нормализации текста. Далее мы используем шаблоны регулярных выражений для извлечения и поиска подстрок.

Часто задаваемые вопросы

Урок «Разделение и замена строк» бесплатный?

Да — полный текст урока «Разделение и замена строк» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Разделение и замена строк»?

Разделяйте строки на несколько столбцов с помощью .str.split(expand=True) и заменяйте подстроки с помощью .str.replace(). Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Разделение и замена строк»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Аксессор .str
  2. Разделение и замена строк
  3. Сопоставление с шаблонами регулярных выражений
  4. Объединение и очистка текстовых столбцов
← Назад к Pandas & NumPy Academy