Функция Pandas Series.str.contains()
Часто используемые функции Pandas
Series.str.contains()это функция в Pandas, используемая для проверки того, содержит ли строка указанную подстроку.
При обработке данных нам часто требуется фильтровать данные на основе текстового содержимого, например находить записи, содержащие определённые ключевые слова, или отфильтровывать текст, соответствующий определённому шаблону.contains()Функция может проверять, содержит ли каждый строковый элемент указанную подстроку или шаблон регулярного выражения.
Значение слова:containsозначает «содержать», указывая, содержит ли строка указанное содержимое.
Базовый синтаксис и параметры
str.contains()является методом строкового аксессора Series, поэтому сначала нужно иметь Series, содержащий строки, а затем использовать.strаксессор, чтобы вызвать его.
Формат синтаксиса
Series.str.contains(pat, case=True, regex=True, na=None)
Описание параметра
| Параметр | Type | Обязательный | Описание | Значение по умолчанию |
|---|---|---|---|---|
| pat | str | Обязательный | Шаблон для поиска, который может быть обычной строкой или регулярным выражением. | - |
| case | bool | Optional | Учитывать ли регистр. По умолчанию True (с учётом регистра). | True |
| regex | bool | Optional | Указывает, следует ли рассматривать параметр pat как регулярное выражение. По умолчанию — True. | True |
| na | объект | Optional | Значение, возвращаемое, когда элемент равен NaN. По умолчанию None (возвращает NaN). | Отсутствует |
Описание функций
- Возвращаемое значение: возвращает логический Series, указывающий, содержит ли каждый элемент заданный шаблон.
- Действие: проверяет каждый строковый элемент в Series и возвращает True или False.
- Примечание: по умолчанию использует сопоставление с регулярными выражениями, что позволяет сопоставлять более сложные шаблоны.
Примеры
Давайте подробно разберём на серии примеров от простого к сложному,str.contains()его использование.
Пример 1: базовое использование — проверка наличия подстроки
Пример
# Создать Series, содержащий текст
s = pd.Series(['apple', 'banana', 'grape', 'pineapple', 'orange'])
# Проверить, содержит ли он 'ap'
result = s.str.contains('ap')
print("Исходный ряд:")
print(s)
print("nContains 'ap':")
print(result)
Результат вывода:
原始 Series: 0 apple 1 banana 2 grape 3 pineapple 4 orange dtype: object 是否包含 'ap': 0 True 1 False 2 True 3 True 4 False
Пояснение к коду:
s.str.contains('ap')Проверьте, содержит ли каждая строка подстроку 'ap'.- 'apple' содержит 'ap', возвращает True.
- 'banana' не содержит 'ap', возвращает False.
- 'grape' содержит 'ap', возвращает True.
- 'pineapple' содержит 'ap', возвращает True.
Пример 2: Использование сопоставления с регулярными выражениями
contains()По умолчанию используются регулярные выражения, которые могут сопоставляться с более сложными шаблонами.
Пример
# Создать Series, содержащий текст
s = pd.Series(['hello123', 'world456', 'example789', 'python', 'test123'])
# Используйте регулярное выражение для сопоставления строк, которые начинаются с буквы и за которыми следуют цифры
result = s.str.contains(r'^[a-zA-Z]+d+$')
print("Исходный ряд:")
print(s)
print("nСопоставьте шаблон, начинающийся с буквы и заканчивающийся цифрой:")
print(result)
Результат вывода:
原始 Series: 0 hello123 1 world456 2 example789 3 python 4 test123 dtype: object 匹配字母开头+数字结尾的模式: 0 True 1 True 2 True 3 False 4 True
Пояснение к коду:
r'^[a-zA-Z]+d+$'Это регулярное выражение, которое соответствует строкам, начинающимся с буквы и заканчивающимся цифрой.^обозначает начало строки,$обозначает конец строки.- 'python' не содержит цифр, поэтому не соответствует.
Пример 3: Сопоставление без учета регистра
Установивcase=Falseсопоставление без учета регистра может быть достигнуто.
Пример
# Создайте Series, содержащий текст в разных регистрах
s = pd.Series(['Apple', 'APPLE', 'apple', 'Banana', 'APPLE'])
# Сопоставление с учетом регистра
result_case = s.str.contains('APPLE')
# Сопоставление без учета регистра
result_nocase = s.str.contains('APPLE', case=False)
print("Исходный ряд:")
print(s)
print("nСовпадение с учётом регистра 'APPLE':")
print(result_case)
print("nСовпадение без учёта регистра 'APPLE':")
print(result_nocase)
Результат вывода:
原始 Series: 0 Apple 1 APPLE 2 apple 3 Banana 4 APPLE dtype: object 区分大小写匹配 'APPLE': 0 False 1 True 2 False 3 False 4 True 不区分大小写匹配 'APPLE': 0 True 1 True 2 True 3 False 4 True
Пояснение к коду:
case=True(по умолчанию) С учётом регистра, совпадает только с точным 'APPLE'.case=FalseБез учёта регистра, 'Apple', 'APPLE' и 'apple' все совпадают.
Пример 4: Обработка пропущенных значений
Черезnaдля параметра можно указать, как обрабатывать значения NaN.
Пример
import numpy as np
# Создать Series, содержащий значения NaN
s = pd.Series(['apple', 'banana', np.nan, 'grape', None])
# Обработка NaN по умолчанию (возвращает NaN)
result_default = s.str.contains('ap')
# Указать, что NaN возвращает False
result_na_false = s.str.contains('ap', na=False)
print("Исходный ряд:")
print(s)
print("nОбработка по умолчанию (возвращает NaN):")
print(result_default)
print("nОбрабатывать NaN как False:")
print(result_na_false)
Результат вывода:
原始 Series: 0 apple 1 banana 2 NaN 3 grape 4 None dtype: object 默认处理(返回 NaN): 0 True 1 False 2 NaN 3 True 4 NaN 将 NaN 视为 False: 0 True 1 False 2 False 3 True 4 False
Пояснение к коду:
- По умолчанию NaN и None возвращают NaN.
- Настройка
na=Falseможно рассматривать NaN как несовпадение. - В реальной обработке данных это полезно и позволяет избежать проблем с фильтрацией, вызванных NaN.
Пример 5: Фильтрация данных
contains()Это часто сочетается с булевой индексацией для фильтрации данных.
Пример
# Создать имитированный Series с данными о товарах
products = pd.Series([
'iPhone 14 Pro',
'Samsung Galaxy S23',
'iPhone 13',
'Google Pixel 7',
'iPad Pro',
'MacBook Air',
'Dell XPS 15'
])
# Отфильтровать товары, содержащие 'iPhone'
iphone_products = products[products.str.contains('iPhone')]
# Отфильтровать товары, не содержащие 'i' (с учётом регистра)
no_i_products = products[~products.str.contains('i')]
print("Все продукты:")
print(products)
print("nПродукты, содержащие 'iPhone':")
print(iphone_products)
print("nПродукты, не содержащие заглавную 'I':")
print(no_i_products)
Результат вывода:
所有产品: 0 iPhone 14 Pro 1 Samsung Galaxy S23 2 iPhone 13 3 Google Pixel 7 4 iPad Pro 5 MacBook Air 6 Dell XPS 15 dtype: object 包含 'iPhone' 的产品: 0 iPhone 14 Pro 2 iPhone 13 dtype: object 不包含大写 'I' 的产品: 6 Dell XPS 15
Пояснение к коду:
products[products.str.contains('iPhone')]Отфильтровать продукты, содержащие 'iPhone'.~products.str.contains('i')Используйте~отрицание для фильтрации продуктов, не содержащих 'i'.- Это распространённая операция при фильтрации данных.
Примечания
str.contains()По умолчанию используются регулярные выражения (regex=True)。- Если нужно сопоставлять обычные строки (не как регулярные выражения), можно установить
regex=False。 - По умолчанию учитывается регистр; используйте
case=Falseчтобы сделать его нечувствительным к регистру. - По умолчанию значения NaN возвращают NaN; используйте
naпараметр для указания возвращаемого значения. - Эта функция возвращает логический Series, который можно напрямую использовать для логической индексации для фильтрации данных.
Другие расширения