目录
316、pandas.Series.str.findall方法
317、pandas.Series.str.fullmatch方法
一、用法精讲
316、pandas.Series.str.findall方法
316-1、语法
# 316、pandas.Series.str.findall方法
pandas.Series.str.findall(pat, flags=0)
Find all occurrences of pattern or regular expression in the Series/Index.
Equivalent to applying re.findall() to all the elements in the Series/Index.
Parameters:
pat
str
Pattern or regular expression.
flags
int, default 0
Flags from re module, e.g. re.IGNORECASE (default is 0, which means no flags).
Returns:
Series/Index of lists of strings
All non-overlapping matches of pattern or regular expression in each string of this Series/Index.
316-2、参数
316-2-1、pat(必须):字符串或正则表达式,表示要查找的正则表达式模式,可以是简单的字符串或复杂的正则表达式。
316-2-2、flags(可选,默认值为0):整数,用于控制正则表达式匹配的标志。例如,可以使用re.IGNORECASE来进行大小写不敏感匹配,可以使用re模块中的任何标志。
316-3、功能
将在每个字符串中查找与正则表达式模式匹配的所有子字符串,并将匹配结果以列表的形式返回。
316-4、返回值
返回一个Series对象,其中每个元素都是一个列表,表示在原字符串中匹配的所有子字符串,如果某个字符串中没有匹配项,返回一个空列表。
316-5、说明
使用场景:
316-5-1、文本数据分析:当你需要深入分析文本内容以提取特定信息时,比如从用户评论中提取关键字、实体或模式。
316-5-2、数据清洗:可以用于清洗数据,提取数据集中的特定格式。例如,从包含日期和时间的字符串中提取日期部分。
316-5-3、模式匹配和数据提取:在数据挖掘和特征提取任务中,当你需要从复杂字符串中提取特定模式(如电子邮件地址、URLs、电话号码等)时,该方法非常方便。
316-5-4、文档和报告生成:在自动生成报告或文档时,可以提取特定的段落或句子,以及统计特定词汇的出现频率。
316-5-5、机器学习特征工程:通过提取文本中的特征(如单词频率、特定词组等),可以为机器学习模型构建新的特征。
316-5-6、数据可视化:在数据可视化之前可以通过这个方法提取信息,以便更好地展示数据中的模式和趋势。
316-6、用法
316-6-1、数据准备
无
316-6-2、代码示例
# 316、pandas.Series.str.findall方法
# 316-1、文本数据分析
import pandas as pd
# 创建示例数据
data = {
'comments': [
"这个产品真的很好,很满意!",
"太差了,完全不值得买。",
"优质服务,让我感到惊喜。",
"质量一般,但性价比高。",
"一分价钱一分货,差强人意。"
]
}
df = pd.DataFrame(data)
# 使用findall提取关键词
df['good_bad'] = df['comments'].str.findall(r'优|差')
print(df, end='\n\n')
# 316-2、数据清洗
import pandas as pd
# 创建示例数据
data = {
'timestamps': [
"2023-10-01 12:30:00",
"2023-10-02 14:45:00",
"2023-10-03 09:15:00",
"Invalid data",
"2023-10-04 18:00:00"
]
}
df = pd.DataFrame(data)
# 使用findall提取日期
df['date'] = df['timestamps'].str.findall(r'\d{4}-\d{2}-\d{2}')
print(df, end='\n\n')
# 316-3、模式匹配和数据提取
import pandas as pd
# 创建示例数据
data = {
'emails': [
"请联系 support@example.com 进行咨询。",
"info@domain.org 是我们的支持邮箱。",
"invalid-email@com 是无效的邮箱。",
"邮件可以发送到 admin123@my-site.co.uk。",
"没有邮箱的文本。"
]
}
df = pd.DataFrame(data)
# 使用findall提取电子邮件
df['extracted_emails'] = df['emails'].str.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}')
print(df, end='\n\n')
# 316-4、数据可视化
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
# 配置字体,确保中文字符正常显示
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
matplotlib.rcParams['axes.unicode_minus'] = False # 确保负号显示正常
# 创建示例数据
data = {
'comments': [
"这个产品真的很好,很满意!",
"太差了,完全不值得买。",
"优质服务,让我感到惊喜。",
"质量一般,但性价比高。",
"一分价钱一分货,差强人意。"
]
}
df = pd.DataFrame(data)
# 使用findall提取关键词
df['good_bad'] = df['comments'].str.findall(r'优|差')
# 统计关键词出现次数
# 使用列表推导式来检查每个列表中是否包含'差'
count_bad = sum(1 for lst in df['good_bad'] if '差' in lst)
# '优'的数量可以直接通过长度计算(假设每个列表最多包含一个'优')
count_good = sum(len(lst) for lst in df['good_bad'] if '优' in lst)
# 或者更简单地,因为findall已经返回了匹配项列表,我们可以直接计算所有列表中'优'的总数
# count_good = sum('优' in lst for lst in df['good_bad'])
# 可视化
labels = ['好', '差']
sizes = [count_good, count_bad]
plt.bar(labels, sizes, color='purple')
plt.title('关键词出现次数')
plt.xlabel('关键词')
plt.ylabel('次数')
plt.show()
316-6-3、结果输出
# 316、pandas.Series.str.findall方法
# 316-1、文本数据分析
# comments good_bad
# 0 这个产品真的很好,很满意! []
# 1 太差了,完全不值得买。 [差]
# 2 优质服务,让我感到惊喜。 [优]
# 3 质量一般,但性价比高。 []
# 4 一分价钱一分货,差强人意。 [差]
# 316-2、数据清洗
# timestamps date
# 0 2023-10-01 12:30:00 [2023-10-01]
# 1 2023-10-02 14:45:00 [2023-10-02]
# 2 2023-10-03 09:15:00 [2023-10-03]
# 3 Invalid data []
# 4 2023-10-04 18:00:00 [2023-10-04]
# 316-3、模式匹配和数据提取
# emails extracted_emails
# 0 请联系 support@example.com 进行咨询。 [support@example.com]
# 1 info@domain.org 是我们的支持邮箱。 [info@domain.org]
# 2 invalid-email@com 是无效的邮箱。 []
# 3 邮件可以发送到 admin123@my-site.co.uk。 [admin123@my-site.co.uk]
# 4 没有邮箱的文本。 []
# 316-4、数据可视化
# 见图1
图1:
317、pandas.Series.str.fullmatch方法
317-1、语法
# 317、pandas.Series.str.fullmatch方法
pandas.Series.str.fullmatch(pat, case=True, flags=0, na=None)
Determine if each string entirely matches a regular expression.
Parameters:
pat
str
Character sequence or regular expression.
case
bool, default True
If True, case sensitive.
flags
int, default 0 (no flags)
Regex module flags, e.g. re.IGNORECASE.
na
scalar, optional
Fill value for missing values. The default depends on dtype of the array. For object-dtype, numpy.nan is used. For StringDtype, pandas.NA is used.
Returns:
Series/Index/array of boolean values.
317-2、参数
317-2-1、pat(必须):字符串或正则表达式,表示要查找的正则表达式模式,可以是简单的字符串或复杂的正则表达式。
317-2-2、case(可选,默认值为True):布尔值,如果为True,则匹配时区分大小写;如果为False,则不区分大小写。
317-2-3、flags(可选,默认值为0):整数,正则表达式的标志(如re.IGNORECASE等),用于修改正则表达式的功能,例如使匹配不区分大小写,该参数与case参数配合使用。
317-2-4、na(可选,默认值为None):用于指定当输入数据为NaN时返回的值,可以设置为任何对象,以替代缺失值的返回结果。
317-3、功能
用于逐元素检查Series中的每个字符串是否完全匹配给定的正则表达式或字符串模式,它可以用来验证字符串是否符合特定格式。
317-4、返回值
返回一个布尔型Series,其中每个元素对应于原始Series中每个字符串的匹配结果:
- 如果字符串完全匹配给定模式,则返回True。
- 如果字符串不匹配或为NaN(且na参数未设置),则返回Fasle。
- 如果na参数被设置,当对应元素为NaN时返回na的值。
317-5、说明
无
317-6、用法
317-6-1、数据准备
无
317-6-2、代码示例
# 317、pandas.Series.str.fullmatch方法
import pandas as pd
# 创建一个Series
s = pd.Series(['abc', '123', 'abc123', None])
# 使用fullmatch验证是否完全匹配字母串'abc'
result = s.str.fullmatch('abc')
print(result)
317-6-3、结果输出
# 317、pandas.Series.str.fullmatch方法
# 0 True
# 1 False
# 2 False
# 3 None
# dtype: object
318、pandas.Series.str.get方法
318-1、语法
# 318、pandas.Series.str.get方法
pandas.Series.str.get(i)
Extract element from each component at specified position or with specified key.
Extract element from lists, tuples, dict, or strings in each element in the Series/Index.
Parameters:
i
int or hashable dict label
Position or key of element to extract.
Returns:
Series or Index.
318-2、参数
318-2-1、i(必须):整数,指定要获取字符的位置(索引),可以是正整数(从字符串开始计数)或负整数(从字符串结束计数)。
318-3、功能
用于从每个字符串中提取指定索引位置的字符,对于长度不足的字符串,返回值为NaN,可以用于访问字符串的特定字符,常见于数据清洗或提取特定信息的场景。
318-4、返回值
返回一个Series,其中包含对应位置字符的值:
- 如果指定位置的字符存在,则返回该字符。
- 如果指定的位置超出了字符串的长度,则返回NaN。
- 返回的Series与输入的Series具有相同的索引。
318-5、说明
无
318-6、用法
318-6-1、数据准备
无
318-6-2、代码示例
# 318、pandas.Series.str.get方法
import pandas as pd
# 创建一个Series
s = pd.Series(['apple', 'banana', 'cherry', None])
# 使用get方法获取每个字符串的第一个字符
result = s.str.get(0)
print(result)
318-6-3、结果输出
# 318、pandas.Series.str.get方法
# 0 a
# 1 b
# 2 c
# 3 None
# dtype: object
319、pandas.Series.str.index方法
319-1、语法
# 319、pandas.Series.str.index方法
pandas.Series.str.index(sub, start=0, end=None)
Return lowest indexes in each string in Series/Index.
Each of the returned indexes corresponds to the position where the substring is fully contained between [start:end]. This is the same as str.find except instead of returning -1, it raises a ValueError when the substring is not found. Equivalent to standard str.index.
Parameters:
sub
str
Substring being searched.
start
int
Left edge index.
end
int
Right edge index.
Returns:
Series or Index of object.
319-2、参数
319-2-1、sub(必须):字符串,表示要查找的子字符串。
319-2-2、start(可选,默认值为0):整数,表示开始查找的起始位置(索引),默认为0,表示从字符串的开头开始查找。
319-2-3、end(可选,默认值为None):整数,表示结束查找的位置(索引),默认为None,表示查找到字符串的末尾。
319-3、功能
用于在每个字符串中查找指定子字符串sub的第一个出现位置,如果找到,则返回该位置的索引;如果没有找到子字符串,则会抛出异常。
319-4、返回值
返回一个Series,其中包含对应子字符串的起始索引位置:
- 如果子字符串在对应的字符串中存在,则返回该子字符串第一次出现的起始位置。
- 如果子字符串在字符串中不存在,则会引发ValueError。
- 返回的Series与输入的Series具有相同的索引。
319-5、说明
无
319-6、用法
319-6-1、数据准备
无
319-6-2、代码示例
# 319、pandas.Series.str.index方法
import pandas as pd
# 创建一个Series
s = pd.Series(['apple', 'banana', 'cherry', None])
result = []
for item in s:
try:
if item is not None:
index = item.index('na')
result.append(index)
else:
result.append(None) # 或者使用NaN,如果Series是pandas的
except ValueError:
result.append(None) # 或使用NaN
except AttributeError:
result.append(None) # 处理非字符串类型
# 如果result需要是pandas Series
result = pd.Series(result, index=s.index)
print(result)
319-6-3、结果输出
# 319、pandas.Series.str.index方法
# 0 NaN
# 1 2.0
# 2 NaN
# 3 NaN
# dtype: float64
320、pandas.Series.str.join方法
320-1、语法
# 320、pandas.Series.str.join方法
pandas.Series.str.join(sep)
Join lists contained as elements in the Series/Index with passed delimiter.
If the elements of a Series are lists themselves, join the content of these lists using the delimiter passed to the function. This function is an equivalent to str.join().
Parameters:
sep
str
Delimiter to use between list entries.
Returns:
Series/Index: object
The list entries concatenated by intervening occurrences of the delimiter.
Raises:
AttributeError
If the supplied Series contains neither strings nor lists.
320-2、参数
320-2-1、sep(必须):字符串,一个分隔符字符串,指定用来连接每个Series元素的字符或字符串,在实际操作中,它可以是任意字符串,比如空格、逗号、换行符等。
320-3、功能
用于将Series中的每个元素(通常是字符串或可以被转换为字符串的对象)连接成一个新的字符串,它特别有用当你有一个包含多个字符串的Series,并且希望将它们合并成一个单一的字符串,使用指定的分隔符进行分隔。
320-4、返回值
返回一个新的Series,其中每个元素都是通过sep将原Series中对应元素连接而成的字符串。
320-5、说明
无
320-6、用法
320-6-1、数据准备
无
320-6-2、代码示例
# 320、pandas.Series.str.join方法
import pandas as pd
# 创建一个示例Series
s = pd.Series(['a', 'b', 'c'])
# 使用str.join连接Series元素
result = s.str.join('-')
print(result)
320-6-3、结果输出
# 320、pandas.Series.str.join方法
# 0 a
# 1 b
# 2 c
# dtype: object