Как удалить строки по условию для строкового значения в pandas кадре данных? - PullRequest
1 голос
/ 29 мая 2020

Рассмотрим Pandas Dataframe, например:

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

Giving:

                   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, чтобы получить результат dataframe, например :

                   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 ]

2 голосов
/ 29 мая 2020

Если мы проверяем domain, мы должны найти домен 100% соответствия, а не использовать строку. поскольку 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 голос
/ 29 мая 2020

Используйте, 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
1 голос
/ 29 мая 2020

вы можете использовать здесь 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
...