找出列表中的哪个项目在 python pandas 行中匹配
Find out which item from a list is matched in a python pandas row
我有一个数据框 (df_email),其中一行对应一封收到的电子邮件。有些电子邮件无法通过发件人电子邮件地址识别,因此我尝试通过在电子邮件内容中查找名称来识别它。我有一个姓名列表,我可以找出我的姓名列表中是否有任何项目与此匹配:
Names = ['Anders','Camilla','Herman','Alma','Solveig']
df_match = df_email.loc[df_email.Email_body.str.contains('|'.join(Names))
...但我不知道在每种情况下匹配的名称。基本上我需要的是如果电子邮件是:“嗨,我可以订购两本书吗?最好的问候安德斯”。
实际上我的名字列表包含超过 150000 个名字,并且编写一个遍历所有名字的 for 循环非常无效(我在 30 分钟后停止了它):
df_email.loc[:,"Customer_name"] = ''
for name in Names:
df_email.Customer_name.loc[df_email.Email_body.str.contains(name)] = name
有没有更有效的方法来获取电子邮件中匹配的姓名?
您可以将 str.findall
与您使用的 '|'.join(Names)
正则表达式一起使用:
例如,如果您的数据框如下所示:
df = pd.DataFrame(
{
"Email_body": [
"something somethine Camilla something",
"hi Alma",
"Anders and Solveig",
"there is no name Here",
]
}
)
Email_body
0 something somethine Camilla something
1 hi Alma
2 Anders and Solveig
3 there is no name Here
你可以这样做:
df["Customer_name"] = df.Email_body.str.findall("|".join(Names))
Email_body Customer_name
0 something somethine Camilla something [Camilla]
1 hi Alma [Alma]
2 Anders and Solveig [Anders, Solveig]
3 there is no name Here []
我有一个数据框 (df_email),其中一行对应一封收到的电子邮件。有些电子邮件无法通过发件人电子邮件地址识别,因此我尝试通过在电子邮件内容中查找名称来识别它。我有一个姓名列表,我可以找出我的姓名列表中是否有任何项目与此匹配:
Names = ['Anders','Camilla','Herman','Alma','Solveig']
df_match = df_email.loc[df_email.Email_body.str.contains('|'.join(Names))
...但我不知道在每种情况下匹配的名称。基本上我需要的是如果电子邮件是:“嗨,我可以订购两本书吗?最好的问候安德斯”。
实际上我的名字列表包含超过 150000 个名字,并且编写一个遍历所有名字的 for 循环非常无效(我在 30 分钟后停止了它):
df_email.loc[:,"Customer_name"] = ''
for name in Names:
df_email.Customer_name.loc[df_email.Email_body.str.contains(name)] = name
有没有更有效的方法来获取电子邮件中匹配的姓名?
您可以将 str.findall
与您使用的 '|'.join(Names)
正则表达式一起使用:
例如,如果您的数据框如下所示:
df = pd.DataFrame(
{
"Email_body": [
"something somethine Camilla something",
"hi Alma",
"Anders and Solveig",
"there is no name Here",
]
}
)
Email_body
0 something somethine Camilla something
1 hi Alma
2 Anders and Solveig
3 there is no name Here
你可以这样做:
df["Customer_name"] = df.Email_body.str.findall("|".join(Names))
Email_body Customer_name
0 something somethine Camilla something [Camilla]
1 hi Alma [Alma]
2 Anders and Solveig [Anders, Solveig]
3 there is no name Here []