Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-基于部分字符串匹配在数据帧中保留行_Python_String_Dataframe_Contains_Partial - Fatal编程技术网

Python-基于部分字符串匹配在数据帧中保留行

Python-基于部分字符串匹配在数据帧中保留行,python,string,dataframe,contains,partial,Python,String,Dataframe,Contains,Partial,我有两个数据帧: df1是邮箱和电子邮件ID的列表 df2显示已批准域的列表 我从excel工作表中读取了两个数据框 xls=pd.ExcelFile(输入文件共享邮箱) df=pd.read\u excel(xls,工作表名称=工作表名称\u共享邮箱) 我只想在df1中保存记录,其中df1[Email\u Id]包含df2[approved\u domain] print(df1) Mailbox Email_Id 0 mailbox1 abc

我有两个数据帧:
df1是邮箱和电子邮件ID的列表
df2显示已批准域的列表

我从excel工作表中读取了两个数据框

xls=pd.ExcelFile(输入文件共享邮箱)
df=pd.read\u excel(xls,工作表名称=工作表名称\u共享邮箱)
我只想在df1中保存记录,其中df1[Email\u Id]包含df2[approved\u domain]

    print(df1)  
        Mailbox Email_Id  
    0   mailbox1   abc@gmail.com  
    1   mailbox2   def@yahoo.com  
    2   mailbox3   ghi@msn.com  

    print(df2)  
        approved_domain  
    0   msn.com  
    1   gmail.com  
我想要df3,它基本上显示

    print (df3)  
        Mailbox Email_Id  
    0   mailbox1   abc@gmail.com  
    1   mailbox3   ghi@msn.com  
这是我现在拥有的代码,我认为很接近,但我无法找出语法中的确切问题

df3=df1[df1['Email\u Id']。应用(lambda x:[如果df2['Approved\u Domains']中的项目在x中的项目。tolist())]
但是你会得到这个错误

TypeError:不可损坏的类型:“列表”

我花了很多时间在论坛上寻找解决方案,但没有找到我想要的。谢谢你的帮助

解决方案 输出: 一些注意事项: 这段代码的大部分基本上只是用于解析数据结构。压缩和解压缩仅用于将列列表转换为行列表并返回。如果已经有行列表,只需执行筛选部分即可

解决方案 输出: 一些注意事项:
这段代码的大部分基本上只是用于解析数据结构。压缩和解压缩仅用于将列列表转换为行列表并返回。如果您已经有一个行列表,您只需执行筛选部分,因此您需要遵循以下步骤来为两个数据帧执行所需操作

1.将“电子邮件地址”列拆分为两个单独的列

     df1['add'], df1['domain'] = df1['email_address'].str.split('@', 1).str
2.然后删除“添加”列以保持数据框干净

      df1 = df1.drop('add',axis =1)
3.通过在“域”列中不选择任何与“已批准域”列不匹配的值,获取仅包含所需值的新数据框

      df_new = df1[~df1['domain'].isin(df2['approved_domain'])]
四,。在df_new中删除“域”列

      df_new = df_new.drop('domain',axis = 1)
这就是结果

    mailbox     email_address
1   mailbox2    def@yahoo.com
2   mailbox3    ghi@msn.com

因此,要对两个数据帧执行所需的操作,需要遵循以下步骤

1.将“电子邮件地址”列拆分为两个单独的列

     df1['add'], df1['domain'] = df1['email_address'].str.split('@', 1).str
2.然后删除“添加”列以保持数据框干净

      df1 = df1.drop('add',axis =1)
3.通过在“域”列中不选择任何与“已批准域”列不匹配的值,获取仅包含所需值的新数据框

      df_new = df1[~df1['domain'].isin(df2['approved_domain'])]
四,。在df_new中删除“域”列

      df_new = df_new.drop('domain',axis = 1)
这就是结果

    mailbox     email_address
1   mailbox2    def@yahoo.com
2   mailbox3    ghi@msn.com

您可以使用动态创建的正则表达式来搜索列表中的有效域,并最终将其过滤掉

这是代码供我们参考

 # -*- coding: utf-8 -*-

import pandas as pd
import re

mailbox_list = [
        ['mailbox1', 'abc@gmail.com'],
        ['mailbox2', 'def@yahoo.com'],
        ['mailbox3', 'ghi@msn.com']]

valid_domains = ['msn.com', 'gmail.com']

df1 = pd.DataFrame(mailbox_list, columns=['Mailbox', 'EmailID'])
df2 = pd.DataFrame(valid_domains)

valid_list = []

for index, row in df1.iterrows():
    for idx, record in df2.iterrows():
        if re.search(rf"@{record[0]}", row[1], re.IGNORECASE):
            valid_list.append([row[0], row[1]])

df3 = pd.DataFrame(valid_list, columns=['Mailbox', 'EmailID'])
print(df3)
其输出为:

    Mailbox        EmailID
0  mailbox1  abc@gmail.com
1  mailbox3    ghi@msn.com

您可以使用动态创建的正则表达式来搜索列表中的有效域,并最终将其过滤掉

这是代码供我们参考

 # -*- coding: utf-8 -*-

import pandas as pd
import re

mailbox_list = [
        ['mailbox1', 'abc@gmail.com'],
        ['mailbox2', 'def@yahoo.com'],
        ['mailbox3', 'ghi@msn.com']]

valid_domains = ['msn.com', 'gmail.com']

df1 = pd.DataFrame(mailbox_list, columns=['Mailbox', 'EmailID'])
df2 = pd.DataFrame(valid_domains)

valid_list = []

for index, row in df1.iterrows():
    for idx, record in df2.iterrows():
        if re.search(rf"@{record[0]}", row[1], re.IGNORECASE):
            valid_list.append([row[0], row[1]])

df3 = pd.DataFrame(valid_list, columns=['Mailbox', 'EmailID'])
print(df3)
其输出为:

    Mailbox        EmailID
0  mailbox1  abc@gmail.com
1  mailbox3    ghi@msn.com

粘贴您的代码,特别是df1和DF2的定义更新了帖子,我从excel选项卡读取,并使用我在主帖子中输入的代码将其加载到df中。粘贴您的代码,特别是df1和DF2的定义更新了帖子,我从excel选项卡读取,并使用我在主帖子中输入的代码将其加载到df中