【问题标题】:Create multiple possible email addresses based on names in Python根据 Python 中的名称创建多个可能的电子邮件地址
【发布时间】:2020-06-02 05:04:18
【问题描述】:

给定一个数据框如下:

  firstname   lastname                     email_address  \
0      Doug     Watson  douglas.watson@dignityhealth.org   
1      Nick   Holekamp    nick.holekamp@rankenjordan.org   
2       Rob  Schreiner        rob.schriener@wellstar.org   
3    Austin   Phillips       austin.phillips@precmed.com   
4     Elise     Geiger               egeiger@puracap.com   
5      Paul      Urick       purick@diplomatpharmacy.com   
6   Michael   Obringer    michael.obringer@lashgroup.com   
7     Craig   Heneghan           cheneghan@west-ward.com   
8     Kathy      Hirst       kathleen.hirst@sunovion.com   
9    Stefan  Bluemmers   stefan.bluemmers@grunenthal.com   

                               companyname  
0                           Dignity Health  
1  Ranken Jordan Pediatric Bridge Hospital  
2                   WellStar Health System  
3         Precision Medical Products, Inc.  
4                              puracap.com  
5              Diplomat Specialty Pharmacy  
6                               Lash Group  
7                West-Ward Pharmaceuticals  
8                 Sunovion Pharmaceuticals  
9                         Grünenthal Group  

我如何使用常见的电子邮件模式创建可能的电子邮件地址,例如:firstlast@example.com, first.last@example.com, f.last@example.com, lastF@example.com, first_last@example.com, firstL@example.com 等。

df['email1'] = df.firstname.str.lower() + '.' + df.lastname.str.lower() + '@' + df.companyname.str.replace('\s+', '').str.lower() + '.com'
print(df['email1'])

输出:

0                           doug.watson@dignityhealth.com
1       nick.holekamp@rankenjordanpediatricbridgehospi...  --->problematic
2                  rob.schreiner@wellstarhealthsystem.com
3       austin.phillips@precisionmedicalproducts,inc..com  --->problematic
4                            elise.geiger@puracap.com.com  --->problematic
                              ...                        
9995              terry.hanley@kempersportsmanagement.com
9996                          christine.marks@geocomp.com
9997                               darryl.rickner@doe.com
9998                     lalit.sharma@lovelylifestyle.com
9999                              parul.dutt@infibeam.com

其中一些似乎很成问题,任何人都可以帮助解决这个问题吗?非常感谢。

已编辑:

print(df) 应用@Sajith Herath 的解决方案后:

输出:

  firstname  lastname                                        companyname  \
0      Nick  Holekamp  Ranken                                        ...   

                                               email  
0                       nick.                    ...  

【问题讨论】:

  • 您可以添加一种在将公司名称用作电子邮件域之前对其进行预处理的方法。例如,去除空格和标点符号、检查长度、检测.com 的变化、去除缩写(,inc)等
  • 这似乎比我想象的要复杂。
  • 你想做什么?您的数据中已经有一个电子邮件列。也许还有另一种方法可以解决您正在解决的原始问题?
  • 是的,你是对的,但我被要求根据模式向用户推荐可能的电子邮件地址。
  • 使用电子邮件字段中的域名就足够了吗?您可以创建first/last 的不同组合并将@domain.com 附加到它。如果这不起作用,那么唯一的选择是在将公司名称用作域之前对其进行建议的预处理。

标签: python-3.x regex pandas dataframe


【解决方案1】:

您可以使用一种方法来创建具有不同分隔符的用户名排列,并定义一个最大长度,以简化使用公司名称的域,如下所示

import pandas as pd
import random

data = {"firstname":["Nick"],"lastname":["Holekamp"],"companyname":["Ranken \
                                        Jordan Pediatric Bridge Hospital"]}
df = pd.DataFrame(data=data)

max_char = 5
emails = []

def simplify_domain(text):
    if len(text)>max_char:
        text = ''.join([c for c in text if c.isupper()])
        return text.lower()
    return text.replace("\s+","").lower()

def username_permutations(first_name,last_name):
  # define separators 
  separators = [".", "_", "-"]
  #lower case
  combinations = list(map(lambda x:f"{first_name.lower()}{x} \
                           {last_name.lower()}",separators))

  #append a random number to tail
  n = random.randint(1, 100) 
  combinations.extend(list(map(lambda x:f"{x}{n}",combinations)))
  return combinations

for index,row in df.iterrows():
    usernames = username_permutations(row["firstname"],row["lastname"])
    email_permutations = list(map(lambda x: f" \
                    {x}@{simplify_domain(row['companyname'])}.com",usernames))
    emails.append(','.join(email_permutations))

df["email"] = emails

最终结果将是nick.holekamp@rjpbh.com,nick_holekamp@rjpbh.com,nick-holekamp@rjpbh.com,nick.holekamp66@rjpbh.com,nick_holekamp66@rjpbh.com,nick-holekamp66@rjpbh.com

您可以修改simplify_domain 方法来验证给定的字符串,例如删除inc.com

【讨论】:

  • 非常感谢,但它提出了NameError: name 'simplify' is not defined,也许您的代码中有一些拼写错误?
  • 没问题。顺便说一句,您的测试结果如何,我测试了您的代码,但输出的电子邮件地址似乎不正确。请检查我在问题中的更新。
  • 用 jupyter notebook 测试,效果也不错。但根据我的真实数据,它引发了AttributeError: 'float' object has no attribute 'lower'
  • 是的。你应该预处理(删除或填充)NaNfloat 值并确保你只传递字符串
猜你喜欢
  • 1970-01-01
  • 2017-11-12
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2018-04-21
相关资源
最近更新 更多