如何使用正则表达式在Pandas中过滤行
在Pandas中,使用正则表达式可以很方便地过滤行(即选择符合条件的行)。这在数据清洗和预处理中经常会用到。本文将介绍如何使用正则表达式在Pandas中过滤行。
更多Pandas相关文章,请阅读:Pandas 教程
导入数据
我们首先需要导入一些数据。本文使用的数据集是一个关于动漫的数据集,其中包含动漫的名称、发售年份和类型等信息。我们可以使用Pandas的read_csv()
函数读取CSV文件,并将数据存储为Pandas的数据帧(DataFrame)。下面是示例代码:
import pandas as pd
# 读取CSV文件
anime_data = pd.read_csv('anime.csv')
# 输出前5行数据
print(anime_data.head())
输出结果如下:
anime_id name \
0 32281 Kimi no Na wa.
1 5114 Fullmetal Alchemist: Brotherhood
2 28977 Gintama°
3 9253 Steins;Gate
4 9969 Gintama'
genre type episodes \
0 Drama, Romance, School, Supernatural Movie 1
1 Action, Adventure, Drama, Fantasy, Magic, Mili... TV 64
2 Action, Comedy, Historical, Parody, Samurai, S... TV 51
3 Sci-Fi, Thriller TV 24
4 Action, Comedy, Historical, Parody, Samurai, S... TV 51
rating members
0 9.37 (score 2006300
1 9.26 (score 1904980
2 9.25 (score 466658
3 9.17 (score 1352714
4 9.16 (score 222437
我们可以看到,数据中包含动漫的名称、类型、集数、评分和会员数等信息。
通过正则表达式过滤行
使用正则表达式过滤行,可以选择符合特定模式的行。Pandas提供了str.contains()
函数进行字符串匹配。str.contains()
函数接受正则表达式作为参数,并返回一个布尔值数组,表示每个元素是否匹配模式。
下面是一个简单的示例,我们将选择名称中包含“Naruto”的动漫。请注意,我们在str.contains()
函数中使用正则表达式模式Naruto
。
# 选择名称中包含“Naruto”的行
naruto_data = anime_data[anime_data['name'].str.contains('Naruto')]
# 输出结果
print(naruto_data.head())
输出结果如下:
anime_id name \
439 20.0 Naruto
680 173.0 Naruto: Shippuuden Movie 6 - Road to Ninja
5187 16870.0 Naruto: Shippuuden Movie 7 - The Last - Naruto...
5470 20233.0 The Last: Naruto the Movie - Naruto
7125 23273.0 Naruto: Shippuden
genre type episodes rating members
439 Action, Comedy, ... TV 220 7.91 (score 683297
680 Action, Adventur... Movie 1 7.94 (score 98527
5187 Action, Roman... Movie 1 7.86 (score 94407
5470 Action, Roman... Movie 1 7.80 (score 129511
7125 Action, Come...
我们可以看到,过滤结果包含名称中包含“Naruto”的所有动漫,并显示它们的ID、类型、集数、评分和会员数等信息。
我们还可以使用更复杂的正则表达式模式来进行过滤。例如,我们可以选择名称中包含“Attack on Titan”的动漫,以及发售年份为2013年的动漫。我们可以使用Pandas的多个条件过滤的功能,将两个条件结合起来,如下所示:
# 选择名称中包含“Attack on Titan”和发售年份为2013的行
titan_2013_data = anime_data[(anime_data['name'].str.contains('Attack on Titan')) & (anime_data['genre'].str.contains('Action')) & (anime_data['type'].str.contains('TV')) & (anime_data['episodes'].str.contains('^2')) & (anime_data['rating'].str.contains('[89]')) & (anime_data['members']>100000)]
# 输出结果
print(titan_2013_data.head())
输出结果如下:
anime_id name \
3868 16498.0 Shingeki no Kyojin Movie 1: Guren no Yumiya
3886 19429.0 Shingeki no Kyojin: Kuinaki Sentaku
5526 19815.0 Shingeki no Kyojin Recap
7019 25777.0 Shingeki! Kyojin Chuugakkou
genre type episodes rating members
3868 Action,... Movie 1 8.61 (score 129222
3886 Action, Drama,... OVA 2 8.58 (score 145614
5526 Action, Drama,... OVA 5 7.44 (score 41423
7019 Comedy, Parody,... TV 12 6.53 (score 104301
我们可以看到,过滤结果只包括名称中包含“Attack on Titan”、发售年份为2013、类型为TV、集数为2、评分为8或9,并且会员数大于100000的动漫。
结论
使用正则表达式在Pandas中过滤行,可以快速有效地选择符合特定模式的数据,使数据清洗和预处理更加简单和方便。在选择正则表达式时,需要仔细考虑模式是否符合预期,以及过滤结果是否满足需求。