Pandas Series.str.contains() 函数
Series.str.contains() 是 Pandas 中用于检查字符串是否包含指定子串的函数。
在数据处理过程中,我们经常需要根据文本内容进行筛选和过滤,比如查找包含特定关键词的记录、过滤出符合某种模式的文本等。contains() 函数可以检查每个字符串元素是否包含指定的子串或正则表达式模式。
单词释义:contains 是"包含"的意思,表示检查字符串中是否包含指定内容。
基本语法与参数
str.contains() 是 Series 的字符串访问器方法,因此你需要先有一个包含字符串的 Series,然后通过 .str 访问器来调用它。
语法格式
Series.str.contains(pat, case=True, regex=True, na=None)
参数说明
| 参数 | 类型 | 是否必填 | 说明 | 默认值 |
|---|---|---|---|---|
| pat | str | 必填 | 要搜索的模式,可以是普通字符串或正则表达式。 | - |
| case | bool | 可选 | 是否区分大小写。默认为 True(区分大小写)。 | True |
| regex | bool | 可选 | 是否将 pat 参数作为正则表达式处理。默认为 True。 | True |
| na | object | 可选 | 当元素为 NaN 时返回的值。默认为 None(返回 NaN)。 | None |
函数说明
- 返回值:返回一个布尔值 Series,表示每个元素是否包含指定模式。
- 效果:对 Series 中的每个字符串元素进行检查,返回 True 或 False。
- 注意:默认使用正则表达式匹配,可以匹配更复杂的模式。
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 str.contains() 的用法。
示例 1:基础用法 - 检查是否包含子串
实例
import pandas as pd
# 创建一个包含文本的 Series
s = pd.Series(['apple', 'banana', 'grape', 'pineapple', 'orange'])
# 检查是否包含 'ap'
result = s.str.contains('ap')
print("原始 Series:")
print(s)
print("n是否包含 'ap':")
print(result)
# 创建一个包含文本的 Series
s = pd.Series(['apple', 'banana', 'grape', 'pineapple', 'orange'])
# 检查是否包含 'ap'
result = s.str.contains('ap')
print("原始 Series:")
print(s)
print("n是否包含 '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() 默认使用正则表达式,可以匹配更复杂的模式。
实例
import pandas as pd
# 创建一个包含文本的 Series
s = pd.Series(['hello123', 'world456', 'runoob789', 'python', 'test123'])
# 使用正则表达式匹配以字母开头后跟数字的字符串
result = s.str.contains(r'^[a-zA-Z]+d+$')
print("原始 Series:")
print(s)
print("n匹配字母开头+数字结尾的模式:")
print(result)
# 创建一个包含文本的 Series
s = pd.Series(['hello123', 'world456', 'runoob789', 'python', 'test123'])
# 使用正则表达式匹配以字母开头后跟数字的字符串
result = s.str.contains(r'^[a-zA-Z]+d+$')
print("原始 Series:")
print(s)
print("n匹配字母开头+数字结尾的模式:")
print(result)
输出结果:
原始 Series: 0 hello123 1 world456 2 runoob789 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 可以实现不区分大小写的匹配。
实例
import pandas as pd
# 创建一个包含不同大小写文本的 Series
s = pd.Series(['Apple', 'APPLE', 'apple', 'Banana', 'APPLE'])
# 区分大小写匹配
result_case = s.str.contains('APPLE')
# 不区分大小写匹配
result_nocase = s.str.contains('APPLE', case=False)
print("原始 Series:")
print(s)
print("n区分大小写匹配 'APPLE':")
print(result_case)
print("n不区分大小写匹配 'APPLE':")
print(result_nocase)
# 创建一个包含不同大小写文本的 Series
s = pd.Series(['Apple', 'APPLE', 'apple', 'Banana', 'APPLE'])
# 区分大小写匹配
result_case = s.str.contains('APPLE')
# 不区分大小写匹配
result_nocase = s.str.contains('APPLE', case=False)
print("原始 Series:")
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 pandas as pd
import numpy as np
# 创建包含 NaN 值的 Series
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("原始 Series:")
print(s)
print("n默认处理(返回 NaN):")
print(result_default)
print("n将 NaN 视为 False:")
print(result_na_false)
import numpy as np
# 创建包含 NaN 值的 Series
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("原始 Series:")
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() 经常与布尔索引结合使用来筛选数据。
实例
import pandas as pd
# 创建一个模拟的产品数据 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)
# 创建一个模拟的产品数据 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,可直接用于布尔索引筛选数据。

Pandas 常用函数