Строковые операции в Pandas
Pandas предоставляет мощные возможности обработки строк. С помощью.strаксессора, вы можете обрабатывать каждый элемент в Series так же, как при работе со строками Python.
Обзор аксессора str
Когда тип данных Series —objectможно использовать.strаксессор для выполнения строковых операций.
Пример
# Создать 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" |
Поиск и замена в строке
Пример
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(" "))
Удаление пробельных символов и дополнение
Пример
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"))
Срезы и конкатенация
Пример
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 поддерживают регулярные выражения, что делает их мощным инструментом для обработки сложных строковых шаблонов.
Пример
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"))
Извлечение и разделение
Пример
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))
Статистика и преобразование
Длина и подсчёт
Пример
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"))
Преобразование типов
Пример
# Преобразование строки в число
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 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аксессора должным образом позволяет эффективно выполнять большинство задач обработки текста.