Python Pandas基于lis丢弃多个值

2024-05-19 02:52:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从数据帧中删除模糊匹配列表中的项的值。在

我有一个数据帧(test_df),看起来像:

   id          email         created_at      
0  1   son@mail_a.com   2017-01-21 18:19:00  
1  2   boy@mail_b.com   2017-01-22 01:19:00  
2  3  girl@mail_c.com   2017-01-22 01:19:00 

我有一个几百个电子邮件域的列表,我正在从一个txt文件中读取这些域,它看起来像:

^{pr2}$

我试图从数据框中删除包含匹配电子邮件域的任何行,方法是使用:

email_domains = open('file.txt', 'r')
to_drop = email_domains.read().splitlines()    
dropped_df = test_df[~test_df['email'].isin(to_drop)]
    print(test_df)

因此,结果应该是:

   id          email         created_at       
0  2   boy@mail_b.com   2017-01-22 01:19:00  
1  3  girl@mail_c.com   2017-01-22 01:19:00 

但第一排有“son@mail_a.com“没有掉下来。有什么建议吗?在


Tags: 数据testtxtcomiddf列表电子邮件
3条回答

您可以使用applysplit字符串,并将其用于isin

print test_df[~test_df['email'].apply(lambda x: x.split('@')[1]).isin(to_drop)]

结果

^{pr2}$

从电子邮件中解析域名非常容易,因此我们可以首先使用.str.split('@')解析域,然后使用isin()方法进行检查:

In [12]: df[~df.email.str.split('@').str[1].isin(domains.domain)]
Out[12]:
   id            email           created_at
1   2   boy@mail_b.com  2017-01-22 01:19:00
2   3  girl@mail_c.com  2017-01-22 01:19:00

其中:

^{pr2}$

isin查找完全匹配的项。您的情况更适合endswithcontains

df[~df['email'].str.endswith(tuple(to_drop))]
Out: 
   id            email           created_at
1   2   boy@mail_b.com  2017-01-22 01:19:00
2   3  girl@mail_c.com  2017-01-22 01:19:00

^{pr2}$

相关问题 更多 >

    热门问题