Обработка текстовых столбцов в Pandas: пошаговое руководство

Раздел: Анализ данных -> 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())  # Ошибка для None

Python работа с большими данными (работа с большими данными в 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=''.

- Python наборы данных (наборы данных в python)
- Python dataframe строки (строки в dataframe pandas)
- столбец dataframe python (работа со столбцом dataframe в pandas)

Продвинутые примеры работы со строками

Извлечение подстрок с помощью именованных групп

Метод .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

Строки в DataFrame pandas - comments

En
Python dataframe строки (python)