根据字符串条件为pandas数据框列分配值

4
假设我有一个数据框:
data
id  URL
1   www.pandora.com
2   m.jcpenney.com
3   www.youtube.com
4   www.facebook.com

我希望创建一个新的列,基于以下条件:如果URL包含特定的单词,例如'youtube',那么我想将该列的值设置为youtube。因此,我尝试了以下代码:
data['test'] = 'other'

那么,一旦我们做到了这一点,我们就会得到:

data['test']
other
other
other
other

然后我尝试了这个方法,

data[data['URL'].str.contains("youtub") == True]['test'] = 'Youtube'
data[data['URL'].str.contains("face") == True]['test'] = 'Facebook'

虽然这段代码没有报错,但是测试列的值并没有改变。所有的列仍然只有其他的值。当我运行这个语句时,理想情况下第三行应该改变为“Youtube”,第四行应该改变为“Facebook”。但是它们并没有改变。有人能告诉我这里犯了什么错误吗?

3个回答

15

我认为您可以使用通过contains创建的布尔掩码来使用loc

print data['URL'].str.contains("youtub")
0    False
1    False
2     True
3    False
Name: URL, dtype: bool

data.loc[data['URL'].str.contains("youtub"),'test'] = 'Youtube'
data.loc[data['URL'].str.contains("face"),'test'] = 'Facebook'
print data
   id               URL      test
0   1   www.pandora.com       NaN
1   2    m.jcpenney.com       NaN
2   3   www.youtube.com   Youtube
3   4  www.facebook.com  Facebook

这个可以工作。只需要做一个小修正,当我们运行它时,会出现一个错误"ValueError: cannot index with vector containing NA / NaN values"。所以只需要在上面给定的条件中添加==True即可。 - haimen
1
这是一个非常优雅的解决方案,对于一个有许多可能答案的问题来说,值得点赞。 - Hatt

8
我会一次性完成它:
replacements = {
  r'.*youtube.*': 'Youtube',
  r'.*face.*': 'Facebook',
  r'.*pandora.*': 'Pandora'
}

df['text'] = df.URL.replace(replacements, regex=True)
df.loc[df.text.str.contains('\.'), 'text'] = 'other'
print(df)

输出:

                 URL      text
id
1    www.pandora.com   Pandora
2     m.jcpenney.com     other
3    www.youtube.com   Youtube
4   www.facebook.com  Facebook

2

考虑到您可能想检查主机名是否匹配(而不是URL中的任何单词),您可以按点拆分字符串,并检查第二个项目(主机名)是否在您的列表中。

targets = ['pandora', 'youtube', 'facebook']
data['target_url'] = [url[1] if url[1] in targets else None 
                      for url in data.URL.str.split('.')]

data
   id               URL target_url
0   1   www.pandora.com    pandora
1   2    m.jcpenney.com       None
2   3   www.youtube.com    youtube
3   4  www.facebook.com   facebook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接