【问题标题】:How to drop rows by condition on string value in pandas dataframe?如何按条件删除熊猫数据框中字符串值的行?
【发布时间】:2020-05-30 15:00:25
【问题描述】:

考虑一个 Pandas 数据框,例如:

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

【问题讨论】:

    标签: python pandas dataframe filtering


    【解决方案1】:

    如果我们检查 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]
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我相信ulr1ulr2 只是假人。对于 OP 的实际数据,您的模式将难以接受。
      • @QuangHoang 已更正。
      【解决方案3】:

      你可以在这里使用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
      

      【讨论】:

      • 我认为'|'.join(domainToCheck) 更安全。
      • @QuangHoang 是的,同意。改了答案。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2016-01-29
      • 2018-09-20
      • 2019-03-15
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多