簡體   English   中英

熊貓:使用str.contains和map查找一些子字符串並替換列中的值

[英]Pandas: using str.contains and map to find some substring and replace value in column

我有數據框

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 ,但是在這種情況下,字符串應該是通用的

一種可能的解決方案:

#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  

通過評論編輯:

似乎沒有字典匹配,可以通過示例進行測試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM