如何用Pandas实现CSV邮箱匹配并排除纯数字前缀邮箱?
需求说明
现有两个CSV文件:
- file1:包含用户姓名、邮箱信息,存在同一用户对应多个邮箱的情况
- file2:包含用户姓名及空邮箱字段
需要为file2填充邮箱,规则:若同一用户有多个邮箱,忽略前缀仅为数字的邮箱(优先选择前缀非纯数字的邮箱;若用户只有纯数字前缀的邮箱,则保留该邮箱)。
示例文件
file1.csv
Name, Mail John Doe, 123@sample.com John Doe, john_doe2@sample.com Anna Davis, 456@sample.com Heather Rockwell, heather_rockwell@sample.com sample man, man_sample@sample.com sample woman, 999@sample.com
file2.csv
Name, Mail Anna Davis, Heather Rockwell, John Doe, sample man, sample woman,
期望输出CSV
Name, Mail Anna Davis, 456@sample.com Heather Rockwell, heather_rockwell@sample.com John Doe, john_doe2@sample.com sample man, man_sample@sample.com sample woman, 999@sample.com
现有代码(待完善)
用户尝试用Pandas实现,但卡在过滤纯数字前缀邮箱的逻辑上:
import pandas as pd data1 = pd.read_csv(file1) data2 = pd.read_csv(file2) for index, user in enumerate(data1.Name): if user in data2.Name.values: if (user.Mail[index] is not consist from numbers only): (add mail)
完善后的实现代码
以下是符合需求的完整Pandas代码:
import pandas as pd # 读取两个CSV文件 data1 = pd.read_csv("file1.csv") data2 = pd.read_csv("file2.csv") # 定义函数:判断邮箱前缀是否为纯数字 def is_digit_prefix(email): # 提取@符号前的前缀部分 prefix = email.split("@")[0] # 判断前缀是否全为数字 return prefix.isdigit() # 对file1的数据处理:标记每个邮箱是否为纯数字前缀 data1["is_digit"] = data1["Mail"].apply(is_digit_prefix) # 按姓名分组,筛选每个用户的有效邮箱:优先选非纯数字前缀的,若没有则保留纯数字前缀的 def select_valid_email(group): # 先筛选非纯数字前缀的邮箱 non_digit_emails = group[group["is_digit"] == False]["Mail"] if not non_digit_emails.empty: return non_digit_emails.iloc[0] # 若没有非纯数字前缀的,返回纯数字前缀的邮箱 else: return group["Mail"].iloc[0] # 分组后得到每个用户的目标邮箱 user_mail_map = data1.groupby("Name").apply(select_valid_email).reset_index(name="Mail") # 将结果合并到file2中,填充邮箱字段 result = pd.merge(data2[["Name"]], user_mail_map, on="Name", how="left") # 保存为输出CSV result.to_csv("output.csv", index=False)
代码逻辑说明
- 读取文件:用
pd.read_csv读取两个输入文件。 - 前缀判断函数:
is_digit_prefix函数拆分邮箱,提取@前的前缀,用isdigit()判断是否为纯数字。 - 标记邮箱类型:给file1的每条数据添加
is_digit列,标记该邮箱是否为纯数字前缀。 - 分组筛选有效邮箱:按姓名分组,对每个用户的邮箱列表,优先选择非纯数字前缀的;如果用户只有纯数字前缀的邮箱,则直接保留。
- 合并填充:将筛选后的邮箱映射表与file2合并,替换空邮箱字段,最后保存结果。
内容的提问来源于stack exchange,提问作者abe_101
相关产品推荐
相关产品推荐

