我有数据框
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,请从df2创建一个列category
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 :(得分: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
通过评论编辑:
似乎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