考虑如下熊猫数据框:
>>> import pandas as pd
>>> df = pd.DataFrame(dict(url=['http://url1.com', 'http://www.url1.com', 'http://www.url2.com','http://www.url3.com','http://www.url1.com']))
>>> df
给予:
url
0 http://url1.com
1 http://www.url1.com
2 http://www.url2.com
3 http://www.url3.com
4 http://www.url1.com
我想删除包含url1.com
和url2.com
的所有行,以获得如下数据框结果:
url
0 http://ww.url3.com
我这样做
domainToCheck = ('url1.com', 'url2.com')
goodUrl = df['url'].apply(lambda x : any(domain in x for domain in domainToCheck))
但这没有结果。
有什么办法解决上述问题吗?
import pandas as pd
import tldextract
df = pd.DataFrame(dict(url=['http://url1.com', 'http://www.url1.com','http://www.url2.com','http://www.url3.com','http://www.url1.com']))
domainToCheck = ['url1', 'url2']
s = df.url.map(lambda x : tldextract.extract(x).domain).isin(domainToCheck)
df = df[~s].reset_index(drop=True)
答案 0 :(得分:2)
如果我们检查domain
,则应该找到100%匹配的域,而不是使用字符串contains。因为subdomain
可能包含与域
import tldextract
s=df.url.map(lambda x : tldextract.extract(x).domain).isin(['url1','url2'])
Out[594]:
0 True
1 True
2 True
3 False
4 True
Name: url, dtype: bool
df=df[~s]
答案 1 :(得分:1)
您可以在此处使用pd.Series.str.contains
。
df[~df.url.str.contains('|'.join(domainToCheck))]
url
3 http://www.url3.com
如果您想重置索引,请使用此
df[~df.url.str.contains('|'.join(domainToCheck))].reset_index(drop=True)
url
0 http://www.url3.com
答案 2 :(得分:1)
使用Series.str.contains
创建一个布尔掩码m
,然后您可以使用此布尔掩码过滤数据帧df
:
m = df['url'].str.contains('|'.join(domainToCheck))
df = df[~m].reset_index(drop=True)
结果:
url
0 http://www.url3.com