Строковые операции в Pandas

Pandas предоставляет мощные возможности обработки строк. С помощью.strаксессора, вы можете обрабатывать каждый элемент в Series так же, как при работе со строками Python.


Обзор аксессора str

Когда тип данных Series —objectможно использовать.strаксессор для выполнения строковых операций.

Пример

import pandas as pd

# Создать Series, содержащий строки
s = pd.Series(["hello", "world", "pandas", "Python"])

print("Исходный ряд:")
print(s)
print()

# Преобразовать в нижний регистр
print("Нижний регистр:")
print(s.str.lower())
print()

# Преобразовать в верхний регистр
print("Верхний регистр:")
print(s.str.upper())
print()

# Сделать первую букву заглавной
print("С заглавной буквы:")
print(s.str.capitalize())

Общие строковые функции

Преобразование регистра

Метод Описание Пример
str.lower() Преобразовать в нижний регистр "Hello" → "hello"
str.upper() Преобразовать в верхний регистр "Hello" → "HELLO"
str.title() Сделать первую букву заглавной "hello world" → "Hello World"
str.capitalize() Сделать первую букву заглавной, остальные строчными "hELLO" → "Hello"
str.swapcase() Изменить регистр на противоположный "HeLLo" → "hEllO"

Поиск и замена в строке

Пример

import pandas as pd

s = pd.Series(["hello world", "python pandas", "data science", "machine learning"])

print("Исходные данные:")
print(s)
print()

# Проверить вхождение
print("Contains 'python':")
print(s.str.contains("python", case=False))
print()

# Проверить начало/конец
print("Начинается с 'hello':")
print(s.str.startswith("hello"))
print()

# Заменить
print("Заменить пробелы на подчёркивания:")
print(s.str.replace(" ", "_"))
print()

# Разделить
print("Разделить по пробелу:")
print(s.str.split(" "))

Удаление пробельных символов и дополнение

Пример

import pandas as pd

s = pd.Series([" hello ", "world ", " pandas", " python "])

print("Исходные данные:")
print(s)
print()

# Удалить ведущие и завершающие пробелы
print("Удаление ведущих/завершающих пробелов:")
print(s.str.strip())
print()

# Удалить пробелы слева
print("Удаление пробелов слева:")
print(s.str.lstrip())
print()

# Удалить пробелы справа
print("Удаление пробелов справа:")
print(s.str.rstrip())
print()

# Дополнить
print("Дополнение 0 слева до длины 10:")
print(s.str.pad(10, side="left", fillchar="0"))

Срезы и конкатенация

Пример

import pandas as pd

s = pd.Series(["hello", "world", "python", "pandas"])

print("Исходные данные:")
print(s)
print()

# Срез
print("Первые 3 символа:")
print(s.str[:3])
print()

# Взять 3 символа начиная с позиции 1
print("Взять 3 символа с позиции 1:")
print(s.str[1:4])
print()

# Конкатенация строк
s1 = pd.Series(["Hello", "World"])
s2 = pd.Series(["Python", "Pandas"])
print("Конкатенация с +:")
print(s1 + " " + s2)
print()

# Объединение с помощью join() (с использованием указанного разделителя)
print("Объединение с помощью join():")
print(s1.str.cat(s2, sep="-"))

Поддержка регулярных выражений

Строковые функции Pandas поддерживают регулярные выражения, что делает их мощным инструментом для обработки сложных строковых шаблонов.

Пример

import pandas as pd

s = pd.Series([
    "[email protected]",
    "[email protected]",
    "invalid-email",
    "[email protected]"
])

print("Исходные данные:")
print(s)
print()

# Извлечь email
print("Извлечь имя пользователя:")
print(s.str.extract(r"(\w+)@"))
print()

print("Извлечь домен:")
print(s.str.extract(r"@(\w+\.\w+)"))
print()

# Заменить
print("Заменить электронную почту на [email]:")
print(s.str.replace(r"\w+@\w+\.\w+", "[email]", regex=True))
print()

# Проверка вхождения
print("Содержит .com или .org:")
print(s.str.contains(r"\.com|\.org"))

Извлечение и разделение

Пример

import pandas as pd

s = pd.Series(["2024-01-01", "2024-02-15", "2024-03-20"])

print("Исходные данные:")
print(s)
print()

# Извлечь год, месяц, день
extract_df = s.str.extract(r"(\d{4})-(\d{2})-(\d{2})")
extract_df.columns = ["Year", "Month", "Day"]
print("Извлечь год/месяц/день:")
print(extract_df)
print()

# Разделить по разделителю
s2 = pd.Series(["a,b,c", "d,e,f", "g,h,i"])
print("Разделить по запятой:")
print(s2.str.split(","))
print()

# Разделить и развернуть в DataFrame
print("Разделить и развернуть:")
print(s2.str.split(",", expand=True))

Статистика и преобразование

Длина и подсчёт

Пример

import pandas as pd

s = pd.Series(["hello", "world", "python", "pandas"])

print("Исходные данные:")
print(s)
print()

# Длина строки
print("Длина строки:")
print(s.str.len())
print()

# Количество символов
s2 = pd.Series(["hello", "world", "aaa", "bbb"])
print("Количество вхождений символа 'l':")
print(s2.str.count("l"))

Преобразование типов

Пример

import pandas as pd

# Преобразование строки в число
s = pd.Series(["1", "2", "3", "abc"])
print("Строка в числовой формат:")
print(pd.to_numeric(s, errors="coerce"))
print()

# Преобразование числа в строку
s2 = pd.Series([1, 2, 3, 4])
print("Число в строку:")
print(s2.astype(str).str.zfill(4))  # Дополнить нулями до 4 цифр

Практика: очистка данных

Пример

import pandas as pd
import numpy as np

# Имитация грязных данных
df = pd.DataFrame({
    "Name": [" Чжан Сань ", "Ли Сы", "Ван У "],
    "Phone": ["138-0000-0000", "13900000000", "  010-12345678  "],
    "Email": ["[email protected]", "[email protected]", "[email protected] "]
})

print("Исходные данные:")
print(df)
print()

# Этапы очистки
# 1. Удаление пробелов
df["Name"] = df["Name"].str.strip()
df["Phone"] = df["Phone"].str.replace("-", "").str.strip()
df["Email"] = df["Email"].str.strip().str.lower()

print("После очистки:")
print(df)
print()

# 2. Проверка данных
print("Проверка email:")
print(df["Email"].str.contains(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))

Важные замечания

1. Обработка пропущенных значений

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

2. Чувствительность к регистру

Большинство функций по умолчанию чувствительны к регистру. Используйтеcase=Falseпараметр для сопоставления без учёта регистра.

3. Производительность регулярных выражений

Регулярные выражения мощные, но относительно медленные. Следите за производительностью при обработке больших объёмов данных.

Обработка строк — важная часть очистки данных. Использование.strаксессора должным образом позволяет эффективно выполнять большинство задач обработки текста.

Другие расширения