2016-12-15 3 views
0

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

member_id,event_type,event_path,event_time,event_date,event_duration 
20077,2016-11-20,"2016-11-20 09:17:07",url,e.mail.ru/message/14794236680000000730/,0 
20077,2016-11-20,"2016-11-20 09:17:07",url,e.mail.ru/message/14794236680000000730/,2 
20077,2016-11-20,"2016-11-20 09:17:09",url,avito.ru/profile/messenger/channel/u2i-558928587-101700461?utm_source=avito_mail&utm_medium=email&utm_campaign=messenger_single&utm_content=test,1 
20077,2016-11-20,"2016-11-20 09:17:37",url,avito.ru/auto/messenger/channel/u2i-558928587-101700461?utm_source=avito_mail&utm_medium=email&utm_campaign=messenger_single&utm_content=test,135 
20077,2016-11-20,"2016-11-20 09:19:53",url,e.mail.ru/message/14794236680000000730/,0 
20077,2016-11-20,"2016-11-20 09:19:53",url,e.mail.ru/message/14794236680000000730/,37 

и есть еще один df2

domain category subcategory unique id count_sec Main category Subcategory 
avito.ru/auto Автомобили Авто 1600 83112396 Auto Avito 
youtube.com Видеопортал Видеохостинг 1317 42710996 Video Youtube 
ok.ru Развлечения  Социальные сети 694 13394605 Social network OK 
kinogo.club Развлечения  Кино 497 8438800 Video Illegal 
e.mail.ru Почтовый сервис None 1124 8428984 Mail.ru Email 
vk.com/audio Видеопортал Видеохостинг 1020 7409440 Music VK 

Обычно я использую:

df['category'] = df.event_date.map(df2.set_index('domain')['Main category'] 

Но это сравните данные, и если он равен, он принимает значения и создает их в новом столбце. Но как я могу сделать то же самое, но использовать, если подстрока в строке?

+0

Возможного дубликата [это можно сделать нечеткое соответствие сливаться с питоном панд?] (Http://stackoverflow.com/questions/13636848/is-it-possible-to-do-fuzzy -match-merge-with-python-pandas) – maxymoo

ответ

0

Я действительно не могу сказать, что именно вы пытаетесь сделать. Но мое предложение было бы что-то вроде этого:

mapping = dict(df2.set_index('domain')['Main category']) 

def map_to_substring(x): 
    for key in mapping.keys(): 
     if x in key: 
      return mapping[key] 
    return '' 

df['category'] = df.event_date.apply(lambda x: map_to_substring(x)) 

Тест на части ФР, как это может занять некоторое время в зависимости от того, сколько у вас данных.

+0

- это любой способ сделать это быстрее? У меня 500 тысяч str в event_date –

0

Без любой эвристического для обнаружения нечетких совпадений, на которых, чтобы присоединиться, вы не будете иметь масштабируемое решение, так как вам нужно сделать O (N 2 ) сравнения.

Для вашего конкретного случая использования я предлагаю извлечь часть URL-адреса, которую вы do хотите сравнить. Может быть что-то вроде

from urlparse import urlparse 

def netloc(s): 
    return urlparse('http://' + s).netloc 

df['netloc'] = df['event_date'].apply(netloc) 
df2['netloc'] = df2['domain'].apply(netloc) 

df.merge(df2, 'left', on='netloc')