如何在条件语句中使用 str.contains() 将函数应用于数据框列的某些元素?

How to use str.contains() in a conditional statement to apply a function to some elements of a dataframe column?

我在 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 to www.Facebook.com). Some of the URLs are already in a clean format (www.Microsoft.com),并将 urlparse().netloc 应用于这些清理URLs 导致单元格为空。因此,我试图将 urlparse().netloc 函数应用于 URL 列的元素,其中元素包含字符串 'http',否则它应该 return 原始 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'。非常感谢任何有关我如何克服这个问题以完成任务的帮助!

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

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

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