根据字符串条件

时间:2016-04-18 18:30:28

标签: python pandas

假设我有一个数据框,

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'

虽然这样运行没有任何错误,但测试列的值不会改变。它仍然只有所有列的其他。当我执行此声明时,理想情况下仅第3行显示更改为' Youtube' Facebook和#4;以及#4; Facebook'但它并没有改变。谁能告诉我我在这里做错了什么?

3 个答案:

答案 0 :(得分:5)

我认为您可以将loccontains创建的布尔掩码一起使用:

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

答案 1 :(得分:5)

我会一次性完成:

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 :(得分:1)

鉴于你可能想要检查主机名是否匹配(而不是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