如何在Pandas DataFrame中验证邮箱并按金额筛选有效数据行
在Pandas中筛选有效邮箱并按金额分类的方法
嗨,我来帮你搞定这个问题!要实现你的需求,我们可以分两步走:先高效验证邮箱格式,再结合金额条件筛选数据。
一、验证邮箱格式的最优方法
在Pandas里,向量化的字符串匹配是验证邮箱的最优方案——比用apply遍历每行效率高得多,尤其适合大数据量场景。我们可以用符合邮箱格式标准的正则表达式,配合Pandas的str.fullmatch()方法来判断邮箱是否有效。
常用邮箱验证正则
这里用一个能覆盖绝大多数合法邮箱的正则(兼容常见的用户名、域名格式):
email_pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
它会检查:
- 用户名部分:允许字母、数字、下划线、点、加号、减号
- 必须包含
@分隔符 - 域名部分:允许字母、数字、减号,且至少有一个
.(比如.com、.co.uk这类多级域名)
给DataFrame添加有效邮箱标记列
我们可以直接用str.fullmatch()生成布尔值列,标记每行的邮箱是否有效:
import pandas as pd import re # 你的示例数据 data = { 'email': ['firstname@firstdomain.com', 'secondname@seconddomain.com', 'thirdname@thirddomain.com', 'kjfslkfj', 'fourthname@fourthdomain.com'], 'euro': [150, 50, 300, 0, 200] } df = pd.DataFrame(data) # 生成有效邮箱掩码 df['valid_email'] = df['email'].str.fullmatch(email_pattern, na=False)
str.fullmatch()会检查整个字符串是否完全匹配正则(避免部分匹配的情况,比如kjfslkfj这种完全不符合的会被标记为False)na=False是处理可能存在的空值(NaN),直接标记为无效邮箱
二、按需求筛选两类数据
现在有了valid_email列,我们可以结合金额条件,用布尔索引快速筛选:
1. 有效邮箱且euro≥100的行
df_gt_100 = df[(df['valid_email']) & (df['euro'] >= 100)]
运行后df_gt_100会包含行0、2、4,也就是金额≥100的有效邮箱数据。
2. 有效邮箱且euro<100的行
df_lt_100 = df[(df['valid_email']) & (df['euro'] < 100)]
运行后df_lt_100会包含行1,也就是金额小于100的有效邮箱数据。
额外说明
如果你需要更严格的邮箱验证(比如支持国际域名的特殊字符、带引号的用户名等),可以调整正则表达式,但上面的方案已经能满足绝大多数日常需求啦。
内容的提问来源于stack exchange,提问作者Manuel
相关产品推荐
相关产品推荐

