python - 找出列表中的哪个项目在 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
有没有更有效的方法可以获得电子邮件中匹配的名称?
解决方案
您可以使用您正在使用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 []
推荐阅读
- html - 如何使用 css 屏蔽与输入类型密码相同的跨度字符
- django - 在 django 表单中填充字段值
- azure - 如何使用服务总线队列优雅地停止工作角色
- react-native - 在视图中添加网络链接
- php - 电报机器人不回答
- python - LPYTHW 练习 41:按原样键入所有内容,但无法运行
- javascript - 如何测试我的 Angular 登录表单的完整覆盖率?无法读取未定义的属性“订阅”
- css - 如何使用谷歌字体中的常规、浅色和粗体字体使用链接?
- bash - pb nagios bash 脚本 null 结果为 if
- android - 如何以静态方法使用电话管理器和位置管理器服务等系统服务?