如何正确拆分邮箱地址(注意二级域名)并生成DataFrame的Provider与Domain列?
问题描述
我希望从DataFrame的df['Email']列生成df['Provider']和df['Domain']两列,期望的拆分结果如下:
| Provider | Domain | |
|---|---|---|
| name.surname@something.com | something | com |
| name.surname@something.city.com | something | city.com |
我最初尝试使用以下代码:
df['Provider'] = (df['Email'].str.split('@').str[1]).str.split('.').str[0] df['Domain'] = (df['Email'].str.split('@').str[1]).str.split('.').str[1]
但该方法无法正确识别二级域名,得到的结果如下:
| Provider | Domain | |
|---|---|---|
| name.surname@something.com | something | com |
| name.surname@something.city.com | something | city |
我找到了一段可处理单个邮箱地址的代码,但不清楚如何应用到DataFrame中:
email = 'name.surname@something.city.com' f1, f2 = email.rsplit('@',1) provider_email, domain_email = [f2.rsplit('.')[i] for i in (0,-1)]
我不一定非要使用这段代码,请问有什么可行的解决方案吗?
解决方案
方法1:利用str.rsplit()分割(推荐)
通过从右侧指定分割次数,完美保留多级域名:
# 提取@符号之后的域名部分 domain_segment = df['Email'].str.rsplit('@', n=1).str[1] # 从右侧按.分割1次,拆分出provider和完整域名 split_result = domain_segment.str.rsplit('.', n=1, expand=True) # 赋值到新列 df['Provider'] = split_result[0] df['Domain'] = split_result[1]
这个方法会将something.city.com分割为something(Provider)和city.com(Domain),完全符合需求。
方法2:用apply()复用单邮箱逻辑
如果你想直接复用已有的单邮箱处理代码,可以用apply遍历每行:
import pandas as pd def parse_email(email): _, domain_part = email.rsplit('@', 1) provider, domain = domain_part.rsplit('.', 1) return provider, domain # 将处理结果扩展为两列 df[['Provider', 'Domain']] = df['Email'].apply(lambda x: pd.Series(parse_email(x)))
方法3:正则表达式提取
适合需要处理更复杂邮箱格式的场景:
# 正则规则:匹配@后、最后一个.前的内容为Provider,最后一个.后的所有内容为Domain regex_pattern = r'@([^\.]+)\.(.+)$' df[['Provider', 'Domain']] = df['Email'].str.extract(regex_pattern)
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

