2016-04-18 17 views
2

假設我有一個數據幀,值分配給一個數據幀大熊貓列基於字符串的條件

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」的變化。但它不會改變。有人可以告訴我我在這裏犯了什麼錯誤嗎?

回答

2

我認爲你可以使用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 
+0

這一個工程。只是一個小的修正,當我們運行這個時,我們會得到一個錯誤「ValueError:不能用包含NA/NaN值的向量索引」。所以只需要添加,== True,如上面給出的條件。 – haimen

4

我會做在一個鏡頭:

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 
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 
相關問題