假设我有一个数据框,
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'但它并没有改变。谁能告诉我我在这里做错了什么?
答案 0 :(得分:5)
我认为您可以将loc
与contains
创建的布尔掩码一起使用:
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