2016-04-18 3 views
2

Предположим, у меня есть dataframe,Присвоить значение столбца панды dataframe на основе строки состояния

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» и 4-е на «Facebook». Но это не меняется. Может ли кто-нибудь сказать мне, какую ошибку я здесь делаю?

ответ

2

Я думаю, что вы можете использовать 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 
+0

Этот продукт работает. Просто небольшая коррекция, когда мы запустим это, мы получим ошибку «ValueError: не может индексировать вектор, содержащий значения NA/NaN». Так что просто нужно добавить, == Истина, как в приведенном выше условии. – 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 
Смежные вопросы