目录
311、pandas.Series.str.encode方法
312、pandas.Series.str.endswith方法
313、pandas.Series.str.extract方法
314、pandas.Series.str.extractall方法
一、用法精讲
311、pandas.Series.str.encode方法
311-1、语法
python
# 311、pandas.Series.str.encode方法
pandas.Series.str.encode(encoding, errors='strict')
Encode character string in the Series/Index using indicated encoding.
Equivalent to str.encode().
Parameters:
encoding
str
errors
str, optional
Returns:
Series/Index of objects
311-2、参数
311-2-1、encoding**(必须)****:**字符串,指定目标编码类型,如utf-8、ascii、latin-1等等,该参数决定了字符串将被编码为哪种格式。
311-2-2、errors**(可选,默认值为'strict')****:**字符串,决定在遇到无法编码的字符时的处理方式,可选值有:
- **'strict':**遇到错误时,抛出UnicodeEncodeError异常。
- **'ignore':**忽略无法编码的字符。
- **'replace':**用?替换无法编码的字符。
- **'backslashreplace':**使用反斜杠转义序列替换无法编码的字符。
- **'namereplace':**使用\N{...}替换无法编码的字符。
311-3、功能
将字符串编码为字节类型(bytes),这对于处理文本数据时尤其有用,比如在处理需要以特定编码存储或传输的文本时。
311-4、返回值
返回一个新的Series,其中的每个元素都是原Series中字符串的编码版本,即字节类型(bytes)。
311-5、说明
无
311-6、用法
311-6-1、数据准备
python
无
311-6-2、代码示例
python
# 311、pandas.Series.str.encode方法
import pandas as pd
s = pd.Series(["hello", "world"])
s_encoded = s.str.encode('utf-8')
print(s_encoded)
311-6-3、结果输出
python
# 311、pandas.Series.str.encode方法
# 0 b'hello'
# 1 b'world'
# dtype: object
312、pandas.Series.str.endswith方法
312-1、语法
python
# 312、pandas.Series.str.endswith方法
pandas.Series.str.endswith(pat, na=None)
Test if the end of each string element matches a pattern.
Equivalent to str.endswith().
Parameters:
pat
str or tuple[str, ...]
Character sequence or tuple of strings. Regular expressions are not accepted.
na
object, default NaN
Object shown if element tested is not a string. The default depends on dtype of the array. For object-dtype, numpy.nan is used. For StringDtype, pandas.NA is used.
Returns:
Series or Index of bool
A Series of booleans indicating whether the given pattern matches the end of each string element.
312-2、参数
312-2-1、pat**(必须)****:**字符串或元组,表示要检查的模式,可以是一个字符串或者包含多个字符串的元组,如果字符串元素以这个模式或模式中的任何一个结尾,则返回True。
312-2-2、na**(可选,默认值为None)****:**用于指定在字符串数据缺失(即NaN)的情况下返回的值,默认情况下,NaN返回NaN,但你可以指定为True或False,以返回布尔值。
312-3、功能
检查每个字符串元素是否以指定的模式结尾,该方法在需要过滤或分组字符串数据时非常有用,例如查找以特定字符或子字符串结尾的行。
312-4、返回值
返回一个布尔类型的Series,其中每个元素的值取决于原Series中的字符串是否以指定的模式结尾,如果是,返回True
;否则,返回False
。对于缺失值(NaN
),返回的值取决于na参数的设置。
312-5、说明
使用场景:
312-5-1、数据过滤: 在处理包含特定后缀的文本数据时,你可以使用该方法进行过滤。例如,如果你有一个包含文件名的Series
,并且你只想保留所有以.csv
结尾的文件名,那么可以使用此方法。
**312-5-2、文本分类:**在文本数据分类任务中,可以根据文本的后缀来确定类别。例如,在分析电子邮件时,你可以根据邮件的主题行(subject)是否以某个关键词结尾来判断邮件的类型。
312-5-3、文件类型识别: 当你处理包含不同类型文件路径的数据时,可以使用此方法识别并分类不同类型的文件。例如,在一个包含文件路径的Series
中,识别所有的图片文件。
**312-5-4、数据清洗:**在数据清洗过程中,可能需要删除或处理不符合特定格式的文本数据。使用该方法可以帮助你快速找到并处理这些数据。例如,删除不符合某种标准的条目。
312-5-5、检查和处理缺失值: 在处理包含缺失值的字符串数据时,可以结合na参数设置来统一处理这些缺失值。例如,在检查字符串数据时,将缺失值统一处理为False。
312-6、用法
312-6-1、数据准备
python
无
312-6-2、代码示例
python
# 312、pandas.Series.str.endswith方法
# 312-1、数据过滤
import pandas as pd
file_names = pd.Series(["data.csv", "report.pdf", "summary.csv", "image.png"])
csv_files = file_names[file_names.str.endswith(".csv")]
print(csv_files, end='\n\n')
# 312-2、文本分类
import pandas as pd
subjects = pd.Series(["Meeting tomorrow", "Project update", "Meeting schedule", "Final report"])
is_meeting = subjects.str.endswith("Meeting")
print(is_meeting, end='\n\n')
# 312-3、文件类型识别
import pandas as pd
file_paths = pd.Series(["/images/photo.jpg", "/documents/report.docx", "/images/logo.png"])
image_files = file_paths[file_paths.str.endswith((".jpg", ".png"))]
print(image_files, end='\n\n')
# 312-4、数据清洗
import pandas as pd
data = pd.Series(["12345", "67890X", "ABCDE", "12345Z"])
clean_data = data[~data.str.endswith("X")]
print(clean_data, end='\n\n')
# 312-5、检查和处理缺失值
import pandas as pd
data = pd.Series(["hello", "world", None, "pandas"])
result = data.str.endswith("d", na=False)
print(result)
312-6-3、结果输出
python
# 312、pandas.Series.str.endswith方法
# 312-1、数据过滤
# 0 data.csv
# 2 summary.csv
# dtype: object
# 312-2、文本分类
# 0 False
# 1 False
# 2 False
# 3 False
# dtype: bool
# 312-3、文件类型识别
# 0 /images/photo.jpg
# 2 /images/logo.png
# dtype: object
# 312-4、数据清洗
# 0 12345
# 2 ABCDE
# 3 12345Z
# dtype: object
# 312-5、检查和处理缺失值
# 0 False
# 1 True
# 2 False
# 3 False
# dtype: bool
313、pandas.Series.str.extract方法
313-1、语法
python
# 313、pandas.Series.str.extract方法
pandas.Series.str.extract(pat, flags=0, expand=True)
Extract capture groups in the regex pat as columns in a DataFrame.
For each subject string in the Series, extract groups from the first match of regular expression pat.
Parameters:
pat
str
Regular expression pattern with capturing groups.
flags
int, default 0 (no flags)
Flags from the re module, e.g. re.IGNORECASE, that modify regular expression matching for things like case, spaces, etc. For more details, see re.
expand
bool, default True
If True, return DataFrame with one column per capture group. If False, return a Series/Index if there is one capture group or DataFrame if there are multiple capture groups.
Returns:
DataFrame or Series or Index
A DataFrame with one row for each subject string, and one column for each group. Any capture group names in regular expression pat will be used for column names; otherwise capture group numbers will be used. The dtype of each result column is always object, even when no match is found. If expand=False and pat has only one capture group, then return a Series (if subject is a Series) or Index (if subject is an Index).
313-2、参数
313-2-1、pat**(必须)****:**一个正则表达式模式,用于指定要提取的内容,模式中可以包含一个或多个捕获组(用括号()包围的部分),这些捕获组中的内容将被提取。
313-2-2、flags**(可选,默认值为0)****:**正则表达式的标志,用于控制正则表达式的行为,常用的标志包括:
- **
re.IGNORECASE
或re.I
:**忽略大小写匹配 - **
re.MULTILINE
或re.M
:**多行匹配模式 re.DOTALL
或re.S
: 让点号.
匹配包括换行符在内的所有字符
313-2-3、expand**(可选,默认值为True)****:**布尔值,如果expand=True,方法返回一个DataFrame,其中每个捕获组对应一个列;如果expand=False,且模式包含一个捕获组,则返回一个Series,否则返回一个DataFrame。
313-3、功能
用于从每个字符串元素中提取匹配正则表达式模式的内容,该方法对数据清洗和特定格式信息提取非常有用。
313-4、返回值
返回DataFrame或Series,取决于expand参数和正则表达式模式中捕获组的数量:如果expand=True,总是返回DataFrame;如果expand=False且模式只有一个捕获组,返回Series;如果有多个捕获组,则返回DataFrame。
313-5、说明
使用场景:
**313-5-1、从字符串中提取结构化信息:**数据集中有一列包含"John Smith"这样的姓名字符串,你需要将名字和姓氏分别存储在不同的列中。例如,从一列包含姓名的字符串中分别提取名字和姓氏。
**313-5-2、处理日期时间格式:**数据集中有一列日期字符串,如"2024-08-12",你可能只想提取年份或月份,用于后续分析。例如,从日期字符串中提取年、月、日。
**313-5-3、提取ID或代码信息:**从产品代码字符串中提取特定部分。例如,数据中有一列产品代码"ABC-123-XZ",你需要从中提取"123"作为产品ID。
**313-5-4、解析日志或错误信息:**你可能在分析服务器日志时,需要提取特定的错误代码来统计不同类型错误的发生频率。例如,从日志字符串中提取错误代码或消息。
**313-5-5、数据清洗:**数据集中包含不规则的地址信息,通过正则表达式提取特定部分,方便后续的标准化处理。例如,从一组地址字符串中提取邮政编码或城市名称。
**313-5-6、正则表达式模式匹配:**数据中有一列包含多种信息混合在一起,如"Order #1234: Item X - $567",你需要提取订单号和金额。例如,从混合字符串中提取包含特定模式的信息。
**313-5-7、分割文本字段:**类似于从"Name: John; Age: 30; Gender: Male"中提取"John"、"30"、"Male"这些信息。例如,从包含多个字段的字符串中提取每个字段。
**313-5-8、数据验证与清理:**数据集中包含电子邮件地址,你需要验证格式是否正确,并分离用户名和域名部分进行分析。例如,验证电子邮件格式,并提取用户名和域名。
313-6、用法
313-6-1、数据准备
python
无
313-6-2、代码示例
python
# 313、pandas.Series.str.extract方法
#313-1、从字符串中提取结构化信息
import pandas as pd
# 创建一个包含姓名的DataFrame
df = pd.DataFrame({
'full_name': ['John Smith', 'Jane Doe', 'Alice Johnson']
})
# 使用str.extract()方法提取名字和姓氏
df[['first_name', 'last_name']] = df['full_name'].str.extract(r'(\w+)\s+(\w+)')
print(df, end='\n\n')
#313-2、处理日期时间格式
import pandas as pd
# 创建一个包含日期的DataFrame
df = pd.DataFrame({
'date': ['2024-08-12', '2023-07-11', '2022-06-10']
})
# 提取年、月、日
df[['year', 'month', 'day']] = df['date'].str.extract(r'(\d{4})-(\d{2})-(\d{2})')
print(df, end='\n\n')
#313-3、提取ID或代码信息
import pandas as pd
# 创建一个包含产品代码的DataFrame
df = pd.DataFrame({
'product_code': ['ABC-123-XZ', 'DEF-456-YZ', 'GHI-789-WX']
})
# 提取产品ID
df['product_id'] = df['product_code'].str.extract(r'-(\d+)-')
print(df, end='\n\n')
#313-4、解析日志或错误信息
import pandas as pd
# 创建一个包含日志信息的DataFrame
df = pd.DataFrame({
'log': ['Error: 404 Not Found', 'Error: 500 Internal Server Error', 'Error: 403 Forbidden']
})
# 提取错误代码
df['error_code'] = df['log'].str.extract(r'Error: (\d{3})')
print(df, end='\n\n')
#313-5、数据清洗
import pandas as pd
# 创建一个包含地址信息的DataFrame
df = pd.DataFrame({
'address': ['123 Main St, Springfield, IL 62704', '456 Elm St, Shelbyville, IL 61561']
})
# 提取邮政编码
df['postal_code'] = df['address'].str.extract(r'(\d{5})')
print(df, end='\n\n')
#313-6、正则表达式模式匹配
import pandas as pd
# 创建一个包含混合信息的DataFrame
df = pd.DataFrame({
'order_info': ['Order #1234: Item X - $567', 'Order #5678: Item Y - $890']
})
# 提取订单号和金额
df[['order_number', 'amount']] = df['order_info'].str.extract(r'Order #(\d+): .* - \$(\d+)')
print(df, end='\n\n')
#313-7、分割文本字段
import pandas as pd
# 创建一个包含多个字段的字符串DataFrame
df = pd.DataFrame({
'info': ['Name: John; Age: 30; Gender: Male', 'Name: Jane; Age: 25; Gender: Female']
})
# 提取名字、年龄、性别
df[['name', 'age', 'gender']] = df['info'].str.extract(r'Name: (\w+); Age: (\d+); Gender: (\w+)')
print(df, end='\n\n')
#313-8、数据验证与清理
import pandas as pd
# 创建一个包含电子邮件的DataFrame
df = pd.DataFrame({
'email': ['john.smith@example.com', 'jane.doe@domain.org']
})
# 提取用户名和域名
df[['username', 'domain']] = df['email'].str.extract(r'([^@]+)@(.+)')
print(df)
313-6-3、结果输出
python
# 313、pandas.Series.str.extract方法
#313-1、从字符串中提取结构化信息
# full_name first_name last_name
# 0 John Smith John Smith
# 1 Jane Doe Jane Doe
# 2 Alice Johnson Alice Johnson
#313-2、处理日期时间格式
# date year month day
# 0 2024-08-12 2024 08 12
# 1 2023-07-11 2023 07 11
# 2 2022-06-10 2022 06 10
#313-3、提取ID或代码信息
# product_code product_id
# 0 ABC-123-XZ 123
# 1 DEF-456-YZ 456
# 2 GHI-789-WX 789
#313-4、解析日志或错误信息
# log error_code
# 0 Error: 404 Not Found 404
# 1 Error: 500 Internal Server Error 500
# 2 Error: 403 Forbidden 403
#313-5、数据清洗
# address postal_code
# 0 123 Main St, Springfield, IL 62704 62704
# 1 456 Elm St, Shelbyville, IL 61561 61561
#313-6、正则表达式模式匹配
# order_info order_number amount
# 0 Order #1234: Item X - $567 1234 567
# 1 Order #5678: Item Y - $890 5678 890
#313-7、分割文本字段
# info name age gender
# 0 Name: John; Age: 30; Gender: Male John 30 Male
# 1 Name: Jane; Age: 25; Gender: Female Jane 25 Female
#313-8、数据验证与清理
# email username domain
# 0 john.smith@example.com john.smith example.com
# 1 jane.doe@domain.org jane.doe domain.org
314、pandas.Series.str.extractall方法
314-1、语法
python
# 314、pandas.Series.str.extractall方法
pandas.Series.str.extractall(pat, flags=0)
Extract capture groups in the regex pat as columns in DataFrame.
For each subject string in the Series, extract groups from all matches of regular expression pat. When each subject string in the Series has exactly one match, extractall(pat).xs(0, level='match') is the same as extract(pat).
Parameters:
pat
str
Regular expression pattern with capturing groups.
flags
int, default 0 (no flags)
A re module flag, for example re.IGNORECASE. These allow to modify regular expression matching for things like case, spaces, etc. Multiple flags can be combined with the bitwise OR operator, for example re.IGNORECASE | re.MULTILINE.
Returns:
DataFrame
A DataFrame with one row for each match, and one column for each group. Its rows have a MultiIndex with first levels that come from the subject Series. The last level is named 'match' and indexes the matches in each item of the Series. Any capture group names in regular expression pat will be used for column names; otherwise capture group numbers will be used.
314-2、参数
314-2-1、pat**(必须)****:**字符串,一个包含正则表达式模式的字符串,该模式用于定义要匹配的文本片段,正则表达式中使用的捕获组(圆括号())用于提取匹配的子字符串,该方法会返回所有匹配的捕获组。
314-2-2、flags**(可选,默认值为0)****:**正则表达式的标志,用于控制正则表达式的行为,常用的标志包括:
- **
re.IGNORECASE
或re.I
:**忽略大小写匹配 - **
re.MULTILINE
或re.M
:**多行匹配模式 re.DOTALL
或re.S
: 让点号.
匹配包括换行符在内的所有字符
314-3、功能
用于在一个Series
或DataFrame
对象的每个字符串元素中,根据给定的正则表达式pat
提取所有匹配的子字符串。与str.extract()
方法不同,extractall()
提取的是所有匹配项,而不仅仅是第一个匹配项。
314-4、返回值
返回值是一个DataFrame,它包含了从字符串中提取的所有匹配项,这个DataFrame的特点如下:
-
行索引(MultiIndex):
- 第一个级别是原始数据的索引,这个索引指示了每一行对应于原始数据的哪一个元素。
- 第二个级别是一个整数索引,表示每个原始字符串中匹配到的第几个子串(从0开始计数)。
-
列:
- 如果正则表达式中有捕获组(即括号()),则返回的 DataFrame 的每一列对应一个捕获组。
- 如果正则表达式中没有命名捕获组,列的名称将是整数(0、1、2......),依次对应捕获组的顺序。
- 如果使用了命名捕获组,那么返回的DataFrame中的列将以这些名称命名。
314-5、说明
常见正则表达式规则清单:
314-5-1、基础字符匹配
- **
.:
**匹配任意单个字符(除了换行符)。 - **
\w:
**匹配任意字母、数字或下划线(相当于[a-zA-Z0-9_])。 - **
\W:
**匹配任意非字母、数字或下划线字符(相当于[^a-zA-Z0-9_])。 - **
\d:
**匹配任意数字(相当于[0-9])。 - **
\D:
**匹配任意非数字字符(相当于[^0-9])。 - **
\s:
**匹配任意空白字符(空格、制表符等)。 - **
\S:
**匹配任意非空白字符。
314-5-2、位置匹配
- **
^:
**匹配字符串的开头。 - **
$:
**匹配字符串的结尾。 - **
\b:
**匹配单词边界(词的开头或结尾)。 - **
\B:
**匹配非单词边界。
314-5-3、量词
- **
*:
**匹配前一个字符0次或多次。 - **
+:
**匹配前一个字符1次或多次。 - **
?:
**匹配前一个字符0次或1次(可选匹配)。 - **
{n}:
**精确匹配前一个字符 n 次。 - **
{n,}:
**匹配前一个字符至少n次。 - **
{n,m}:
**匹配前一个字符至少n次且至多m次。
314-5-4、字符类
- **
[abc]:
**匹配a、b或c中的任意一个字符。 - **
[^abc]:
**匹配除a、b、c 之外的任意字符。 - **
[a-z]:
**匹配从a到z范围内的任意字符。
314-5-5、分组与捕获
- **
(abc):
**将abc作为一个捕获组,匹配字符串'abc'。 - **
(?:abc):
**非捕获组,匹配'abc'但不进行捕获。 - **
(?P<name>abc):
**命名捕获组,将匹配的'abc'捕获到name组中。
314-5-6、逻辑或
- **
a|b:
**匹配a或b。
314-5-7、转义字符
\:
用于转义特殊字符。例如,\.
匹配一个点,而不是任意字符。
314-5-8、贪婪与非贪婪匹配
- 默认情况下,
*
,+
,?
和{}
是贪婪的,即尽可能多地匹配。 - 在量词后加上
?
(如*?
,+?
,{n,m}?
)使其变为非贪婪模式,只匹配尽可能少的字符。
314-6、用法
314-6-1、数据准备
python
无
314-6-2、代码示例
python
# 314、pandas.Series.str.extractall方法
import pandas as pd
# 创建一个包含订单信息的Series
s = pd.Series(['Order #1234: $567', 'Order #5678: $890'])
# 使用extractall提取订单号和金额
result = s.str.extractall(r'Order #(\d+): \$(\d+)')
print(result)
314-6-3、结果输出
python
# 314、pandas.Series.str.extractall方法
# 0 1
# match
# 0 0 1234 567
# 1 0 5678 890
315、pandas.Series.str.find方法
315-1、语法
python
# 315、pandas.Series.str.find方法
pandas.Series.str.find(sub, start=0, end=None)
Return lowest indexes in each strings in the Series/Index.
Each of returned indexes corresponds to the position where the substring is fully contained between [start:end]. Return -1 on failure. Equivalent to standard str.find().
Parameters:
sub
str
Substring being searched.
start
int
Left edge index.
end
int
Right edge index.
Returns:
Series or Index of int.
315-2、参数
315-2-1、sub**(必须)****:**字符串,表示要查找的子字符串,该方法会在Series的每个字符串元素中寻找这个子字符串。
315-2-2、start**(可选,默认值为0)****:**整数,表示查找的起始位置(以字符索引为基准)。默认为0,即从字符串的开头开始查找。
315-2-3、end**(可选,默认值为None)****:**整数,表示查找的结束位置(以字符索引为基准)。默认为None,即查找到字符串的结尾。如果指定了end,则查找会在该索引前停止。
315-3、功能
查找子字符串sub在Series的每个字符串元素中的第一次出现的位置。如果找到了子字符串,则返回其在字符串中的第一个字符的索引;如果未找到,则返回-1。
315-4、返回值
返回一个整数类型的Series,其中每个元素表示子字符串sub在对应原始字符串中的起始索引,如果某个字符串中未找到子字符串,则对应位置返回-1。
315-5、说明
无
315-6、用法
315-6-1、数据准备
python
无
315-6-2、代码示例
python
# 315、pandas.Series.str.find方法
import pandas as pd
# 创建一个Series
s = pd.Series(["apple", "banana", "cherry", "date"])
# 查找'a'在每个字符串中的位置
result = s.str.find('a')
print(result)
315-6-3、结果输出
python
# 315、pandas.Series.str.find方法
# 0 0
# 1 1
# 2 -1
# 3 1
# dtype: int64