Обработка текстовых столбцов в Pandas: пошаговое руководство
Основные методы работы со строками
Как применить текстовые операции ко всем значениям столбца наиболее эффективно?
Самый производительный способ - использовать встроенный str-аксессор Pandas. Он предоставляет векторизованные методы для строковых столбцов, работающие быстрее циклов и apply.
import pandas as pd
df = pd.DataFrame({'Имя': [' АНДРЕЙ ', 'мария', 'ИВАН', 'елена']})
df['Имя'] = df['Имя'].str.strip().str.capitalize()
print(df)обработка больших данных python (обработка больших данных в python)
Имя 0 Андрей 1 Мария 2 Иван 3 Елена
очистка данных python (очистка данных в python)
Метод .str.strip() удаляет пробелы, .str.capitalize() приводит первую букву к верхнему регистру. Цепочка методов выполняется за один проход по данным.
Типичная ошибка: вызов .str на столбце с пропущенными значениями (NaN). В результате пропуски остаются без изменений, но если попытаться применить метод напрямую к NaN, возникает AttributeError. Пример:
df = pd.DataFrame({'Имя': ['Андрей', None, 'Мария']})
df['Имя'] = df['Имя'].str.upper() # Работает, None остаётся None
Python подготовка данных (подготовка данных в python)
0 АНДРЕЙ 1 None 2 МАРИЯ
работа с dataframe python (работа с dataframe в python)
Ошибочный код:
df['Имя'] = df['Имя'].apply(lambda x: x.upper()) # Ошибка для NonePython работа с большими данными (работа с большими данными в python)
Как обработать строки через функцию Python?
Если нужно использовать нестандартную логику, применяют .apply() с лямбда-функцией. Однако этот способ медленнее векторизованного, особенно на больших данных.
df['Имя'] = df['Имя'].apply(lambda x: x[0].upper() + x[1:].lower())структурированные данные python (структурированные данные в python)
Для простых преобразований предпочтение отдают .str.
Как использовать map или list comprehension для строк?
map и генераторы списков также работают, но не являются idiomatic для Pandas. Пример с map:
df['Имя'] = list(map(lambda x: x.title(), df['Имя']))генерация данных python (генерация данных в python)
Генератор списка может быть быстрее apply, но уступает векторизованным методам. Для замены подстрок лучше использовать .str.replace.
Проблема: использование map или списковых включений приводит к потере индексов, если не передать результат обратно в Series. Кроме того, при наличии NaN потребуется дополнительная проверка.
Как работать с регулярными выражениями в строках?
Методы .str.contains(), .str.extract(), .str.replace() поддерживают regex. Пример поиска всех строк, содержащих цифры:
df = pd.DataFrame({'текст': ['номер 1', 'без цифр', '12 штук']})
print(df[df['текст'].str.contains(r'\d', na=False)])Python код символа (код символа в python)
текст 0 номер 1 2 12 штук
код из файла python (код из файла python)
Параметр na=False игнорирует пропуски.
Ошибка: забыть экранировать специальные символы (точка, звёздочка) при literal-поиске. Решение - использовать regex=False.
Как разделить строку на несколько столбцов?
Метод .str.split(expand=True) удобен для разбивки по разделителю. Например, из полного имени получить фамилию и имя:
df = pd.DataFrame({'ФИО': ['Иванов Иван', 'Петрова Мария']})
df[['Фамилия', 'Имя']] = df['ФИО'].str.split(' ', expand=True)
print(df)обработка данных на python (обработка данных на python)
ФИО Фамилия Имя 0 Иванов Иван Иванов Иван 1 Петрова Мария Петрова Мария
обработка символьных данных python (обработка символьных данных в python)
Если количество частей неизвестно, указывают n (количество разбиений).
Как заменить часть строки по шаблону?
Метод .str.replace() с regex или без. Пример замены всех чисел на слово 'NUMBER':
df = pd.DataFrame({'текст': ['код 123', 'пункт 45']})
df['текст'] = df['текст'].str.replace(r'\d+', 'NUMBER', regex=True)
print(df)Python преобразование в строку (преобразование в строку в python)
текст 0 код NUMBER 1 пункт NUMBER
Python как проверить строку (проверка строки в python)
С версии Pandas 1.4 для literal-замены без regex параметр regex=False обязателен.
Как объединить строки из нескольких столбцов?
Используют оператор + или .str.cat(). Пример:
df = pd.DataFrame({'Фамилия': ['Иванов'], 'Имя': ['Иван']})
df['Полное'] = df['Фамилия'] + ' ' + df['Имя']
# или
df['Полное'] = df['Фамилия'].str.cat(df['Имя'], sep=' ')
Оба способа корректно обрабатывают NaN (строка с NaN становится NaN).
Проблема: использование + с NaN приводит к NaN, что может быть нежелательно. .str.cat() имеет параметр na_rep для замены пропусков, например na_rep=''.
Продвинутые примеры работы со строками
Извлечение подстрок с помощью именованных групп
Метод .str.extract() поддерживает именованные группы в regex, что позволяет сразу получать именованные столбцы.
import pandas as pd
df = pd.DataFrame({'email': ['ivan@example.com', 'maria@test.org', None]})
df_extr = df['email'].str.extract(r'(?P<login>[^@]+)@(?P<domain>.+)')
print(df_extr)
login domain 0 ivan example.com 1 maria test.org 2 NaN NaN
Разделение строки на столбцы с разным количеством частей
Если нужно разделить строку по пробелам, но число слов может быть разным, используют .str.split(expand=True) без указания n, затем объединяют лишние столбцы обратно или оставляют как есть.
df = pd.DataFrame({'фраза': ['один два три', 'четыре пять']})
split_df = df['фраза'].str.split(' ', expand=True)
print(split_df)
0 1 2 0 один два три 1 четыре пять None
Замена с использованием обратной ссылки
В .str.replace() можно ссылаться на группы захвата с помощью \1, \2 и т.д. Пример перестановки фамилии и имени:
df = pd.DataFrame({'ФИО': ['Иванов Иван', 'Петрова Мария']})
df['ФИО'] = df['ФИО'].str.replace(r'(\w+)\s+(\w+)', r'\2 \1', regex=True)
print(df)
ФИО 0 Иван Иванов 1 Мария Петрова
Фильтрация строк по длине
Метод .str.len() возвращает длину строки. Используют для фильтрации или создания новых признаков.
df = pd.DataFrame({'код': ['A123', 'B45', 'C6789']})
df['длина'] = df['код'].str.len()
print(df[df['длина'] > 3])
код длина 0 A123 4 2 C6789 5
Проверка начала и конца строки
.str.startswith() и .str.endswith() возвращают маску. Полезно для отбора записей, начинающихся с определённого префикса.
df = pd.DataFrame({'url': ['/page1', '/admin', '/page2']})
print(df[df['url'].str.startswith('/adm')])
url 1 /admin
Преобразование строки в список символов (one-hot encoding)
Метод .str.get_dummies() разбивает строку на отдельные символы и создаёт двоичные столбцы. Применяется, например, для анализа геномных последовательностей.
df = pd.DataFrame({'seq': ['ACGT', 'CGTA']})
dummies = df['seq'].str.get_dummies()
print(dummies)
A C G T 0 1 1 1 1 1 0 1 1 1
Удаление знаков препинания и лишних символов
Можно комбинировать .str.replace() с классом символов \W (всё, кроме букв, цифр и подчёркивания).
df = pd.DataFrame({'текст': ['Привет, мир!', 'Это #тест.']})
df['чистый'] = df['текст'].str.replace(r'\W+', ' ', regex=True).str.strip()
print(df)
текст чистый 0 Привет, мир! Привет мир 1 Это #тест. Это тест
Обработка пропусков при конкатенации
Параметр na_rep в .str.cat() заменяет NaN на заданное значение, что позволяет избежать потери строк.
df = pd.DataFrame({'a': ['aa', None], 'b': ['bb', 'cc']})
result = df['a'].str.cat(df['b'], sep='-', na_rep='')
print(result)
0 aa-bb 1 -cc # здесь 'aa' был None, заменён на пустую строку, поэтому '-cc'
Использование .str.pad() и .str.center() для выравнивания
Эти методы добавляют символы слева, справа или с обеих сторон для достижения заданной длины.
s = pd.Series(['1', '12', '123'])
print(s.str.pad(width=5, side='left', fillchar='0'))
0 00001 1 00012 2 00123