我想要一个方法来将整个加载数据表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
答案 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模式以多种选择方式组合成一个模式。