详解pandas.Series.str.extract()(提取序列中的字符串)函数使用方法

  • Post category:Python

pandas是Python的一个用于数据分析的库,其中的Series.str.extract()方法可以用于对Series填入的字符串进行提取或修改,其作用包括以下几个方面:

1.模式匹配:可以根据指定的正则表达式语法,对填入的字符串进行模式匹配,提取想要的信息,如数字、日期、电子邮件地址、电话号码等等。

2.字符串分割:可以将字符串按照指定的delimiters进行分割,返回由分割后的子字符串组成的数组。

3.字符串替换:可以通过正则表达式匹配,对字符串中的特定内容进行替换。

下面简单介绍一下这个函数的调用方法:

Series.str.extract(pat, flags=0, expand=True)

其中参数pat是正则表达式语句,在这里指定要提取的信息,flag可以用来指定匹配的选项,例如忽略大小写等等,expand则指定返回结果是否展开成DataFrame,默认值为True。

下面分别通过两个实例来介绍:

实例一

我们拥有这样一份数据:

Name
0   Lisa Simpson
1  Bart Simpson
2   Marge Simpson
3   Maggie Simpson

现在我们想要将这个数据按照名字和姓氏进行分割。

代码如下:

import pandas as pd

# 创建数据
data = pd.DataFrame({'Name': ['Lisa Simpson', 'Bart Simpson', 'Marge Simpson', 'Maggie Simpson']})

# 提取‘姓氏’和‘名字’
data['First Name'] = data['Name'].str.extract('(\w+)', expand=True)
data['Last Name'] = data['Name'].str.extract('(\w+$)', expand=True)

print(data)

输出结果:

              Name First Name Last Name
0    Lisa Simpson       Lisa   Simpson
1    Bart Simpson       Bart   Simpson
2   Marge Simpson      Marge   Simpson
3  Maggie Simpson     Maggie   Simpson

实例二

现在我们有一个包含多个同邮箱的电子邮件列表,我们想要将其整理为一个字典,键为电子邮件地址,值为该地址出现的次数。

代码如下:

import pandas as pd

# 创建数据
data = pd.DataFrame({'Email': ['tom@gmail.com', 'jerry@yahoo.com', 'sam@gmail.com', 'tom@gmail.com']})

# 统计每个电子邮件出现的次数
email_dict = {}
for email in data['Email']:
    if email not in email_dict.keys():
        email_dict[email] = 1
    else:
        email_dict[email] += 1

print(email_dict)

输出结果:

{'tom@gmail.com': 2, 'jerry@yahoo.com': 1, 'sam@gmail.com': 1}

这样做虽然可以完成任务,但是过于繁琐。我们可以使用Series.str.extract()代替for循环,用正则表达式匹配提取出邮件地址,并计数。

代码如下:

import pandas as pd

# 创建数据
data = pd.DataFrame({'Email': ['tom@gmail.com', 'jerry@yahoo.com', 'sam@gmail.com', 'tom@gmail.com']})

# 统计每个电子邮件出现的次数
email_dict = data['Email'].str.extract('(\w+@\w+\.\w+)', expand=False).value_counts().to_dict()

print(email_dict)

输出结果与前一个实例一致:

{'tom@gmail.com': 2, 'jerry@yahoo.com': 1, 'sam@gmail.com': 1}

在这个例子中,Series.str.extract()函数使用了正则表达式语句来匹配电子邮件地址,在expand参数设为False的情况下,返回的是pandas.Series对象,直接应用value_counts()函数可以计数,最后再将结果转换为字典。

总的来说,Series.str.extract()是一种非常方便的pandas数据处理方法,可以在数据预处理阶段使用,从而简化分析任务的复杂度。当然,需要注意的是,由于其内部使用了正则表达式,如果正则表达式语句写的不当,可能会导致结果错误或异常,所以建议使用前先熟悉一些基本的正则表达式语法知识。