Python Pandas - 类似于ISIN,但是"包含"与"精确"匹配

Mar*_*lio 5 python dataframe pandas

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

>>> filtered_list = magic_happens_here(customer, blacklist)
>>> filtered_list
    Email First Name
0 bob@example.com    Bob
1 jim@example.com    Jim
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的:

  1. 为了消除特定的电子邮件地址,过去我曾经使用过df1[df1['email'].isin(~df2['email'])......但是对于我在这里描述的用例显然没有帮助.
  2. 我尝试过使用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.

剩下的问题是:

  1. 这里最好的方法是什么?
  2. 为什么发电机不能调用?
  3. ...最终,当排除集中存在电子邮件地址域时,如何从数据框中排除客户?

Ved*_*hta 4

代码 -

import pandas as pd


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"]})

invalid_emails = tuple(blacklist['Domain'])

df = customer[customer['Email'].apply(lambda s: not s.endswith(invalid_emails))]

print(df)
Run Code Online (Sandbox Code Playgroud)

输出 -

             Email First Name
0  bob@example.com        Bob
1  jim@example.com        Jim
Run Code Online (Sandbox Code Playgroud)