2016-10-21 2 views
-1

У меня есть dataframeПанды: используя str.contains и карту, чтобы найти определенную подстроку и заменить значение в колонке

member_id,device_type,device_id,event_type,event_path,event_duration 
603609,url,mail.ru/,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,mail.ru/,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,mail.ru/,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,mail.ru/,3,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,mail.ru/community.livejournal.com/psp_ru,28,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,lady.mail.ru/article/491411-kurban-omarov-otvetil-na-obvinenija-ksenii-borodinoj/?from=mr_news,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,mail.ru/,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,lady.mail.ru/article/491411-kurban-omarov-otvetil-na-obvinenija-ksenii-borodinoj/?from=mr_news,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,lady.mail.ru/article/491411-kurban-omarov-otvetil-na-obvinenija-ksenii-borodinoj/?from=mr_news,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 

И я должен найти подстроку из другого файла, и если он содержит Pattrn, создать столбец category из df2

url category category2 
falloutsite.ru/ Рубрики/Hi-Tech/Программы/Софт/Игры/ Рубрики/Hi-Tech/Программы/Софт/Игры/ 
kmzpub.ru/games.asp Рубрики/Hi-Tech/Программы/Софт/Игры/Универсальное/ Рубрики/Hi-Tech/Программы/Софт/Игры/Универсальное/ 
sigma-team.ru/content/view/15/19 Рубрики/Hi-Tech/Программы/Софт/Игры/Quake и Counter-Strike/  Рубрики/Hi-Tech/Программы/Софт/Игры/Quake и Counter-Strike/ 
community.livejournal.com/psp_ru Рубрики/Развлечения/Игры/Приставочные игры/  Рубрики/Развлечения/Игры/Приставочные игры/ 

Я использую

df = df1[df1['device_id'].str.contains('|'.join(find_urls))] 

найти подстроку, но как я могу это заменить. Я обычно использую map, но в этом случае строки должны быть общими

+0

Что такое 'find_urls'? – jezrael

+0

@jezrael это список url ​​из df2 'df2.url.values.tolist()' –

+0

Хмм, какой размер 'len (df2)'? – jezrael

ответ

2

Одно из возможных решений:

#create dict for map 
d = df2.set_index('url')['category'].to_dict() 
print (d) 
{'community.livejournal.com/psp_ru': 'Рубрики/Развлечения/Игры/Приставочныеигры/', 
'kmzpub.ru/games.asp': 'Рубрики/Hi-Tech/Программы/Софт/Игры/Универсальное/Рубрики/Hi-Tech/Программы/Софт/Игры/Универсальное/', 
'falloutsite.ru/': 'Рубрики/Hi-Tech/Программы/Софт/Игры/', 
'sigma-team.ru/content/view/15/19': 'Рубрики/Hi-Tech/Программы/Софт/Игры/QuakeиCounter-Strike/'} 

#use list comprehension for map by substring 
print (df1.device_id.apply(lambda x: pd.Series([v for k,v in d.items() if k in x]))) 
              0 
0           NaN 
1           NaN 
2           NaN 
3           NaN 
4 Рубрики/Развлечения/Игры/Приставочныеигры/ 
5           NaN 
6           NaN 
7           NaN 
8           NaN 

df1['category']=df1.device_id.apply(lambda x: pd.Series([v for k,v in d.items() if k in x])) 
print (df1) 
    member_id device_type           device_id \ 
0  603609   url           mail.ru/ 
1  603609   url           mail.ru/ 
2  603609   url           mail.ru/ 
3  603609   url           mail.ru/ 
4  603609   url   mail.ru/community.livejournal.com/psp_ru 
5  603609   url lady.mail.ru/article/491411-kurban-omarov-otve... 
6  603609   url           mail.ru/ 
7  603609   url lady.mail.ru/article/491411-kurban-omarov-otve... 
8  603609   url lady.mail.ru/article/491411-kurban-omarov-otve... 

    event_type event_path     event_duration \ 
0   0   pc 7d4a095373874b4fb26a2e6d070b6ad3 
1   0   pc 7d4a095373874b4fb26a2e6d070b6ad3 
2   0   pc 7d4a095373874b4fb26a2e6d070b6ad3 
3   3   pc 7d4a095373874b4fb26a2e6d070b6ad3 
4   28   pc 7d4a095373874b4fb26a2e6d070b6ad3 
5   0   pc 7d4a095373874b4fb26a2e6d070b6ad3 
6   0   pc 7d4a095373874b4fb26a2e6d070b6ad3 
7   0   pc 7d4a095373874b4fb26a2e6d070b6ad3 
8   0   pc 7d4a095373874b4fb26a2e6d070b6ad3 

            category 
0           NaN 
1           NaN 
2           NaN 
3           NaN 
4 Рубрики/Развлечения/Игры/Приставочныеигры/ 
5           NaN 
6           NaN 
7           NaN 
8           NaN 

EDIT замечанием:

Кажется, есть нет соответствия dict, вы можете проверить его по образцу:

df1 = pd.DataFrame({'device_id':['a d','b s','c r'], 'b':[1,2,3]})  
df2 = pd.DataFrame({'url':['a','m','k'], 'category':['one','two','three']})  
#df2 = pd.DataFrame({'url':['a r','m','k'], 'category':['one','two','three']})  


d = df2.set_index('url')['category'].to_dict() 
print (d) 
{'k': 'three', 'a': 'one', 'm': 'two'} 

df1['category']=df1.device_id.apply(lambda x: pd.Series([v for k,v in d.items() if k in x])) 
print (df1) 
    b device_id category 
0 1  a d  one 
1 2  b s  NaN 
2 3  c r  NaN 
+0

'df3 = df1.url.str.extract (pat, expand = True)' возвращает 'AssertionError: извините, но эта версия поддерживает только 100 названных групп'. Я попытался использовать 'df = df1 [df1 ['device_id']. Str.contains ('|' .join (find_urls))]' и next 'print (pd.merge (df, df2 [['url', ' category ']], how =' left ', on =' url ')) ', но столбец с категорией пуст –

+0

См. мое редактирование. – jezrael

+0

сначала он возвращает предупреждение 'sys: 1: DtypeWarning: Столбцы (0,3) имеют смешанные типы. Укажите опцию dtype при импорте или установите значение low_memory = False.' и следующую ошибку 'ValueError: неправильное количество элементов, прошедших 0, размещение означает 1' –

Смежные вопросы