移除DataFrame姓名列的邮箱域名,提取纯姓名/邮箱用户名
解决Pandas DataFrame中姓名列的邮箱域名及数字清理问题
问题场景
给定包含姓名/邮箱混合内容的DataFrame:
import pandas as pd df = pd.DataFrame({'id': ['1','2','3','4','5','6','7'], 'name': ['Andy','Ben@gmail.com','Charlie3@ymail.com','Dean','Edgar@icloud.com','Frank','Gabriel@yahoo.com']})
需要将邮箱格式的内容保留@前的用户名(去除数字),非邮箱内容直接去除数字,最终得到纯姓名列。
原代码问题分析
你写的正则替换存在两个核心问题:
- 仅匹配了
@后字母数字部分(比如@gmail),但域名里的.com这类带符号的部分,只会把.替换成空格,com作为字母会被保留,导致结果残留com; - 替换用空格填充,会引入不必要的空白字符。
解决方案
方法1:字符串分割+正则清理(直观易懂)
直接截取@前的内容,再去掉所有数字:
import re def clean_name(name): # 取@前的部分,无@则取原字符串 username = name.split('@')[0] # 删除所有数字字符 return re.sub(r'\d+', '', username) df['name'] = df['name'].apply(clean_name)
方法2:Pandas向量化字符串操作(高效简洁)
利用Pandas内置的字符串方法,无需循环/apply,处理大数据集时效率更高:
df['name'] = df['name'].str.split('@').str[0].str.replace(r'\d+', '', regex=True)
最终结果
运行后得到目标DataFrame:
id name 0 1 Andy 1 2 Ben 2 3 Charlie 3 4 Dean 4 5 Edgar 5 6 Frank 6 7 Gabriel
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

