如何将列表项与pandas DataFrame值进行比较

时间:2019-06-17 13:00:01

标签: python-3.x pandas

我想要一个方法来将整个加载数据表DataFrame的值与domain_list中的一项匹配。如果loading_list中的电子邮件在domain_list中包含域,则应在match_list中填充该域。

我尝试了许多方法,例如contains(domain_list),loaded_list == domain_list-使用[row]和DataFrame列标题名称以及熊猫提供的IsIn方法。都没有运气

loaded_list = []
match_list = []
domain_list = ['@hotmail.co.uk', '@gmail.com']

#This line below is from List to DataFrame
domain_list = pd.DataFrame(domain_list, columns=['Email Address'])
with open(self.breach_file, 'r', encoding='utf-8-sig') as breach_file:
    found_reader = pd.read_csv(breach_file, sep=':', names=['Email Address'], engine='c')
    loaded_list = found_reader
    print("List Parsed... Enumerating Content Types")
    breach_file.close()


match_list = ???
print(f"Match:\n {match_list}")

我想要的预期结果是var match_list,它显示其中包含domain_list的email中的电子邮件。

尝试的方法(isin,contains())弹出了许多错误。不想使用For Loops来处理大量数据。

列表示例

loaded_list:
    abc@gmail.com
    def@blaa.com
    ghi@hotmail.co.uk
    jkl@hotmail.com
    mnop@yahoo.com

domain_list:
    @gmail.com
    @hotmail.co.uk

1 个答案:

答案 0 :(得分:1)

您尝试通过连接以“ |”分隔的值来尝试使用domain_list生成正则表达式然后使用此生成的模式过滤load_list?

示例:

In[1]: loaded_list=pd.Series([
    "abc@gmail.com",
    "def@blaa.com",
    "ghi@hotmail.co.uk",
    "jkl@hotmail.com",
    "mnop@yahoo.com"
])


In[2]: domain_list=pd.Series([
    "@gmail.com",
    "@hotmail.co.uk"
])
In[3]: import re
In[4]: match_list = loaded_list[loaded_list.str.contains(domain_list.apply(re.escape).str.cat(sep="|"))]
In[5]: match_list
Out[5]:
0        abc@gmail.com
2    ghi@hotmail.co.uk
dtype: object

我对domain_list中的所有特殊字符进行了转义(以避免正则表达式特殊字符出现任何问题),然后使用cat使用str.cat方法将所有domain_list模式以多种选择方式组合成一个模式。