【问题标题】:How to use str.contains() in a conditional statement to apply a function to some elements of a dataframe column?如何在条件语句中使用 str.contains() 将函数应用于数据框列的某些元素?
【发布时间】:2021-10-20 11:40:16
【问题描述】:

我在 pandas 数据框中有一列,其中包含指向网站的各种 URL:

df:
    ID   URL
0   1    https://www.Facebook.com/fr
1   2    https://Twitter.com/de
2   3    https://www.Youtube.com
3   4    www.Microsoft.com
4   5    https://www.Stackovervlow.com

我正在使用 urlparse().netloc 清理 URL,使其仅包含域名(例如,从 https://www.Facebook.com/fr 到 www.Facebook.com)。一些 URL 已经是干净的格式(上面的www.Microsoft.com),将urlparse().netloc 应用于这些干净的 URL 会导致一个空单元格。因此,我试图将 urlparse().netloc 函数应用于包含字符串“http”的 URL 列的元素,否则它应该返回原始 URL。这是我尝试使用的代码:

df['URL'] = df['URL'].apply(
    lambda x: urlparse(x).netloc if x.str.contains("http", na=False) else x
)

但是,我收到此错误消息:AttributeError: 'str' object has no attribute 'str'。任何有关我如何克服这个问题以完成任务的帮助将不胜感激!

【问题讨论】:

    标签: python pandas urlparse


    【解决方案1】:

    您正在使用pandas.Series.apply,因此您的函数 (lambda) 本身接收元素 (str),因此您可以简单地使用 in,如下所示

    df['URL'] = df['URL'].apply(
        lambda x: urlparse(x).netloc if "http" in x else x
    )
    

    【讨论】:

      【解决方案2】:

      x 已经是一个字符串,而不是Series。所以使用x.find:

      df['URL'] = df['URL'].apply(
          lambda x: urlparse(x).netloc if x.find("http") != -1 else x
      )
      print(df)
      
      # Output:
         ID                    URL
      0   1       www.Facebook.com
      1   2            Twitter.com
      2   3        www.Youtube.com
      3   4      www.Microsoft.com
      4   5  www.Stackovervlow.com
      

      但是你可以使用str.extract来获取netloc:

      df['URL'] = df['URL'].str.extract(r'(?:^https?://)?([^/]+)', expand=False)
      print(df)
      
      # Output:
         ID                    URL
      0   1       www.Facebook.com
      1   2            Twitter.com
      2   3        www.Youtube.com
      3   4      www.Microsoft.com
      4   5  www.Stackovervlow.com
      
      

      【讨论】:

        猜你喜欢
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-24
        • 1970-01-01
        • 2019-10-15
        • 2021-02-03
        • 2017-01-05
        相关资源
        最近更新 更多