首页 > 解决方案 > 找出列表中的哪个项目在 python pandas 行中匹配

问题描述

我有一个数据框(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

有没有更有效的方法可以获得电子邮件中匹配的名称?

标签: pythonpandasstringmatch

解决方案


您可以使用您正在使用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                 []

推荐阅读