You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

代码逻辑说明

  1. 读取文件:用pd.read_csv读取两个输入文件。
  2. 前缀判断函数:is_digit_prefix函数拆分邮箱,提取@前的前缀,用isdigit()判断是否为纯数字。
  3. 标记邮箱类型:给file1的每条数据添加is_digit列,标记该邮箱是否为纯数字前缀。
  4. 分组筛选有效邮箱:按姓名分组,对每个用户的邮箱列表,优先选择非纯数字前缀的;如果用户只有纯数字前缀的邮箱,则直接保留。
  5. 合并填充:将筛选后的邮箱映射表与file2合并,替换空邮箱字段,最后保存结果。

内容的提问来源于stack exchange,提问作者abe_101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:10:29