找出列表中的哪个项目在 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                 []