Skip to main content
 首页 » 编程设计

python之如何提取数据框的所有电子邮件地址和电话号码

2024年09月03日29zhengyun_ustc

我有一个包含电子邮件文本的数据框:

 id      e-mail 
 1        text_1 
 2        text_2 
 3        text_3 
 .          . 
 .          . 

使用 text1(例如):

"Gallag, Keit G" <Keit.Gallag@chart.com>  
Date: Friday, March 29, 2019 at 3:14 AM  
To: Lesl Kirch <ljkirch@action.com> 
Subject: Automatic reply: News Recap, March 29, 2019 Issue of CrossTalk   
 
Thank you for your email. I will be out of the office Thursday, March 28th  
through Monday, April 1st. I will respond to emails on Tuesday, April 2nd.  
If this is urgent please contact lisa.chiap@chart.com or  for National  
Account question or Steph.thomp@chart.com or 309-557-1234 for  
National TeleSales  
inquiries.   
Thank you, Keith 

我需要提取发件人的电子邮件(第一封电子邮件)、电子邮件文本中的所有电子邮件地址和所有美国电话号码,并显示如下结果:

 id   email       sender_email                   mail              telephone 
 1     text_1     Keit.Gallag@chart.com    ljkirch@action.com  309-557-1234 
 1     text_1     Keit.Gallag@chart.com   lisa.chiap@chart.com  ? 
 1     text_1     Keit.Gallag@chart.com   Steph.thomp@chart.com  ? 
 2     text_2     e-mail_sender_2               e-mail_text_2_1           Tel_text_2_1 
 2     text_2     e-mail_sender_2               e-mail_text_2_2           Tel_text_2_2  
 2     text_2     e-mail_sender_2                     ?                   Tel_text_2_3 
 3     text_3     e-mail_sender_3               e-mail_text_3_1           Tel_text_3_1 
 4     text_4     e-mail_sender_4               e-mail_text_4_1             ? 
 .       .             .                             .                       . 
 .       .             .                             .                                . 

电子邮件的数量和美国电话号码的数量在电子邮件正文中有所不同(介于 0 和 +inf 之间)。

请您参考如下方法:

使用正则表达式,如果您提供的电子邮件示例包含在数据框 ['Data_col'] 的一列中,那么要将 4 个电子邮件地址和电话号码提取到单独的列中,您可以使用:

df['Email_address']=df['Data_col'].str.findall('(\S+@\S+)') 

然后将电子邮件地址分隔到单独的列中,使用:

df[['Email_address_1','Email_address_2','Email_address_3','Email_address_4']]=pd.DataFrame(df['Email_address'].values.tolist()) 

对于电话号码,使用:

df['Phone_number']=df['Data_col'].str.extract('(\d{3}[-\.\s]\d{3}[-\.\s]\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]\d{4}|\d{3}[-\.\s]\d{4})') 

希望对您有所帮助。