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

问题描述

我在 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/frwww.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'。任何有关如何克服此问题以完成任务的帮助将不胜感激!

标签: pythonpandasurlparse

解决方案


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


推荐阅读