我有一个包含电子邮件文本的数据框:
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之间)有所不同。
答案 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