【发布时间】:2016-06-02 16:54:53
【问题描述】:
我正在使用 Python Pandas 处理两个数据帧。第一个数据框包含来自客户数据库(名字、姓氏、电子邮件等)的记录。第二个数据框包含 域名 列表,例如gmail.com、hotmail.com 等
当电子邮件地址包含第二个列表中的域名时,我正在尝试从客户数据框中排除记录。换句话说,当客户的电子邮件地址域出现在域黑名单中时,我需要删除他们。
以下是示例数据框:
>>> customer = pd.DataFrame({'Email': [
"bob@example.com",
"jim@example.com",
"joe@gmail.com"], 'First Name': [
"Bob",
"Jim",
"Joe"]})
>>> blacklist = pd.DataFrame({'Domain': ["gmail.com", "outlook.com"]})
>>> customer
Email First Name
0 bob@example.com Bob
1 jim@example.com Jim
2 joe@gmail.com Joe
>>> blacklist
Domain
0 gmail.com
1 outlook.com
我想要的输出是:
>>> filtered_list = magic_happens_here(customer, blacklist)
>>> filtered_list
Email First Name
0 bob@example.com Bob
1 jim@example.com Jim
到目前为止我已经尝试过:
- 为了消除特定电子邮件地址,过去我使用过
df1[df1['email'].isin(~df2['email'])...但显然对我在这里描述的用例没有帮助。 - 我尝试过使用
df.apply,但语法不正确,我想实际数据集的性能会很糟糕。示例:df1['Email'].apply(lambda x: x for i in ['gmail.com', 'outlook.com'] if i in x)。虽然这看起来应该可行,但我得到了TypeError: 'generator' object is not callable。
剩下的问题是:
- 这里最好的方法是什么?
- 为什么生成器不可调用?
- ...最终,当排除集中存在电子邮件地址域时,如何将客户从数据框中排除?
【问题讨论】:
-
添加示例数据框。
-
@VedangMehta 好点,我添加了示例数据框。
-
我添加了一些比较和时间安排 - 你可能会感兴趣...