如何在熊猫数据框中按字符串值的条件删除行?

时间:2020-05-29 15:36:18

标签: python pandas dataframe filtering

考虑如下熊猫数据框:

>>> 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.comurl2.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)

3 个答案:

答案 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