如何基于Pandas DataFrame其他列参数生成符合规则的随机邮箱列?
Pandas按行参数生成指定规则随机收件人列表
实现思路
要同时满足「收件人总数量」和「归属域名总数量」两个约束,核心逻辑分三步:
- 先随机生成指定个数的不重复域名
- 给每个域名先分配至少1个收件人,保证所有域名都被实际用到,不会出现域名数不足的情况
- 剩余的收件人随机从已生成的域名中分配,最后打乱列表顺序消除生成规律
扩展后的随机邮箱生成函数
import string import random import pandas as pd def random_email_gen(num_recipients, num_domains): num_recipients = int(num_recipients) num_domains = int(num_domains) # 参数合法性校验 if num_domains > num_recipients: raise ValueError("域名总数不能大于收件人总数,无法满足每个域名至少对应1个收件人") # 生成指定数量的不重复随机域名 domains = set() while len(domains) < num_domains: domain_name = ''.join(random.choice(string.ascii_lowercase) for _ in range(3)) domains.add(f"{domain_name}.com") # 如需自定义后缀可修改此处 domains = list(domains) emails = [] # 先给每个域名分配1个收件人,确保所有域名都被使用 for d in domains: username = ''.join(random.choice(string.ascii_lowercase) for _ in range(4)) emails.append(f"{username}@{d}") # 分配剩余收件人 for _ in range(num_recipients - num_domains): username = ''.join(random.choice(string.ascii_lowercase) for _ in range(4)) emails.append(f"{username}@{random.choice(domains)}") # 打乱顺序消除生成规律 random.shuffle(emails) return emails
给DataFrame新增Recipients列
直接用apply逐行传入两个对应列的参数即可:
# 构建示例数据集 data = {'Date':['19/06/2022', '19/06/2022', '20/06/2022', '20/06/2022', '21/06/2022', '21/06/2022'], 'Time':['8:25:12', '9:21:33', '18:26:28', '11:39:23', '7:30:47', '20:27:48'], 'Sender': ['fqqp@abc.com', 'jald@abc.com', 'acpo@abc.com', 'smfa@abc.com', 'jald@abc.com', 'fczz@abc.com'], 'Number of recipient domains': [2, 3, 3, 4, 3, 5], 'Number of recipients': [7, 4, 7, 4, 6, 7] } df = pd.DataFrame(data) # 逐行生成收件人列表 df['Recipients'] = df.apply( lambda row: random_email_gen( num_recipients=row['Number of recipients'], num_domains=row['Number of recipient domains'] ), axis=1 )
效果示例
以第一行为例,传入num_domains=2、num_recipients=7,生成结果类似:
['twku@zpl.com', 'dprs@xmv.com', 'qvfn@zpl.com', 'ryho@xmv.com', 'cwjk@zpl.com', 'aepx@zpl.com', 'ifub@xmv.com']
可以看到仅用到zpl.com、xmv.com2个域名,收件人总数为7,完全符合参数要求。
可自定义调整项
- 如需多域名后缀(如
.pqr、.io、.cn等),可提前定义后缀列表随机选取:tld_list = ['.com', '.pqr', '.io', '.cn'] # 生成域名时改为 domains.add(f"{domain_name}{random.choice(tld_list)}") - 如需使用固定域名池而非每行生成随机域名,可将域名生成逻辑移到函数外,把域名列表作为参数传入函数即可
- 用户名、域名主体的长度直接修改
range()内的数值即可调整
内容的提问来源于stack exchange,提问作者Kristada673
相关产品推荐
相关产品推荐

