使用Pandas的str.extract和str.extractall方法高效提取数据框中的特定内容
使用str.extract提取数据框中的特定内容

Pandas 具备一个方法 str.extract,此方法可依据正则表达式来提取数据框中的内容。它会返回一个新的数据框,该数据框中包含着由与模式相匹配的所有子字符串所构成的列。以下是一个简单的示例:
import pandas as pd
data 包含了名为 'Alice'、'Bob'、'Charlie' 的元素。这些元素在名为 'name' 的列表中。
'age': [25, 30, 35],
邮箱地址有:'alice@example.com',还有:'bob@example.com',以及:'charlie@example.com'。
df = pd.DataFrame(data)
# 提取email中的用户名和域名
df 提取出 'email' 列中的内容,然后通过 str.extract 方法进行提取操作,提取出的结果分别存储在新的两列 'username' 和 'domain' 中,其中 'username' 列存储的是 '@' 符号之前的部分,'domain' 列存储的是 '@' 符号之后的部分,即一个单词加上一个点和另一个单词的组合。
print(df)
输出结果如下:
name 表示人的称呼;age 指人的年龄;email 是电子信函的意思;username 为用户名称;domain 则是领域、范围的意思。
Alice 年龄为 25 岁,其邮箱为 alice@example.com,她叫 alice,所在域为 example.com。
Bob 是 30 岁,他的邮箱是 bob@example.com,在 example.com 这个平台上。
Charlie 是 35 岁,他的邮箱是 charlie@example.com,他来自 example.com。
在上述例子里,我们运用了正则表达式(\w+)@(\w+.\w+),此表达式能够对 email 地址里的用户名和域名进行匹配。我们借助 str.extract 方法,将提取出来的结果存储到了两个新的列当中。
使用str.extractall提取数据框中的多个匹配结果
str.extractall 与 str.extract 具有相似性,不同的地方在于它具备一次性提取数据框中所有能与正则表达式相匹配的子字符串的能力。以下是一个示例:
import pandas as pd
data 包含了这样的内容:'The quick brown fox','jumps over','the lazy dog.' 。其中,'The quick brown fox' 是一个描述,'jumps over' 表示跳跃动作,'the lazy dog.' 是另一个描述对象。
df = pd.DataFrame(data)
# 提取每个单词
df 中的['words']这一列,是通过对 df 中的['text']这一列使用 str.extractall('(\w+)')方法提取出所有单词后,再进行 unstack 操作得到的。
print(df)
输出结果如下:
text words
match 0 是一种情况,1 是另一种情况,2 又是一种情况,3 是一种,4 是一种,5 是一种。
它跳过了 NaN 、NaN 、NaN 。它跳跃着越过了 NaN 、NaN 、NaN 。它以跳跃的方式越过了 NaN 、NaN 、NaN 。
那只慵懒的狗。这只慵懒的狗。NaN NaN
在上述例子里,我们运用了正则表达式(\w+)来对每一个单词进行匹配。str.extractall 会返回一个具有多层索引的数据框,接着我们利用 unstack 方法将其转变为普通的数据框。
使用str.contains判断数据框中是否包含特定内容
str.contains 方法能够用于判断数据框中是否存在符合正则表达式规则的内容,并且会返回一个布尔类型的 Series 对象。以下是一个示例:
import pandas as pd
data = {'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35],
'email': ['alice@example.com', 'bob@example.com', 'charlie@example.com']}
df = pd.DataFrame(data)
# 判断email是否包含com域名
df 中包含一个名为 'contains_com' 的列,该列的值是通过对 'email' 列中的每个元素进行判断得到的。具体来说,就是判断每个元素中是否包含 'com' 这个字符串,如果包含则该元素对应的 'contains_com' 列的值为 True,否则为 False。即 df['contains_com'] 的值是由 df['email'].str.contains('com') 这个操作所确定的。
print(df)
输出结果如下:
名字是 name ,年龄是 age ,邮箱是 email ,包含 com 。
Alice 年龄为 25 岁,其邮箱为 alice@example.com,该信息为真。
Bob 是 30 岁,邮箱是 bob@example.com,这是真实的。
Charlie 是 35 岁,邮箱地址是 charlie@example.com,这是真实的。
在上述例子里,我们运用正则表达式 com 来判别 email 地址里是否包含 com 域名,并且将结果储存到了新的列当中。
使用str.replace替换数据框中的特定内容
str.replace 方法能够用来替换数据框里符合正则表达式规则的内容。以下是一个示例:
import pandas as pd
data = {'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35],
'email': ['alice@example.com', 'bob@example.com', 'charlie@example.com']}
df = pd.DataFrame(data)
# 把email地址中的.com替换为.net
df 中的 'email' 列通过 str.replace 方法将 '.com' 替换为 '.net' 。
print(df)
输出结果如下:
name age email
Alice 年龄为 25 岁,其邮箱地址为 alice@example.net。
Bob 年龄为 30 岁,其邮箱为 bob@example.net 。
Charlie 是 35 岁,其邮箱地址为 charlie@example.net。
在上述例子里,我们运用了正则表达式.com 来对 email 地址中的.com 域名进行匹配,接着把它替换成了.net。
总结
我们在本文中介绍了怎样利用正则表达式从 Pandas 数据框里提取特定的内容。我们运用了 str.extract 这种方法,也运用了 str.extractall 这种方法,还运用了 str.contains 以及 str.replace 等方法来达成此目的。正则表达式是一个极为强大的文本匹配工具,对于数据科学工作者而言,熟练地掌握它是很重要的。