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

时间:2019-04-30 23:46:21

标签: python pandas

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

 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之间)有所不同。

2 个答案:

答案 0 :(得分:1)

使用正则表达式,如果您提供的电子邮件示例包含在数据框['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})')

希望这有更多帮助。

答案 1 :(得分:1)

我不确定这是您要找的东西。至少它给你一个提示。

import re

info = []
for text in df["text"]:
    mail1 = re.findall("(\S+@\S+)",text)[:1]
    try:
        mail2 = re.findall("(\S+@\S+)",text)[1:]
        phone = re.findall("(\d{3}[\W]\d{3}[\W]\d{4})",text)
        mail1.insert(len(mail1),(", ".join(m for m in mail2)))
        mail1.insert(len(mail1),phone[0])
    except:
        pass
    info.append(mail1)

df[['Sender', 'Other_mails', 'Phone']] = pd.DataFrame(info)
df
相关问题