如何在Pandas中匹配关键词并返回匹配项而非布尔标记
Pandas关键词匹配:返回匹配元素而非0/1
现有如下数据集和代码:
import pandas as pd dx = pd.DataFrame({'IDs':[1234,5346,1234,8793,8793], 'Names':['APPLE ABCD ONE','APPLE ABCD','NO STRAWBERRY YES','ORANGE AVAILABLE','TEA AVAILABLE']}) kw = ['APPLE', 'ORANGE', 'LEMONS', 'STRAWBERRY', 'BLUEBERRY', 'TEA COFFEE'] # 当前代码仅返回0/1 dx['Check']=dx['Names'].apply(lambda x: 1 if any(k in x for k in kw) else 0)
当前Check列仅标记匹配状态(1/0),需求改为返回实际匹配的kw元素,以下是几种可行方案:
方案1:返回第一个匹配的关键词
若只需返回第一个命中的关键词,未匹配则返回None:
dx['Check'] = dx['Names'].apply( lambda x: next((k for k in kw if k in x), None) )
运行结果:
| IDs | Names | Check |
|---|---|---|
| 1234 | APPLE ABCD ONE | APPLE |
| 5346 | APPLE ABCD | APPLE |
| 1234 | NO STRAWBERRY YES | STRAWBERRY |
| 8793 | ORANGE AVAILABLE | ORANGE |
| 8793 | TEA AVAILABLE | None |
注:
TEA AVAILABLE未匹配是因为kw中的TEA COFFEE是完整子串,若需匹配单个"TEA",需将kw中的TEA COFFEE改为TEA。
方案2:返回所有匹配的关键词(列表形式)
如果存在多个关键词匹配(比如Names值为"APPLE STRAWBERRY"),返回所有匹配项的列表:
dx['Check'] = dx['Names'].apply( lambda x: [k for k in kw if k in x] )
无匹配的行会返回空列表[],若需替换为None可调整代码:
dx['Check'] = dx['Names'].apply( lambda x: [k for k in kw if k in x] or None )
方案3:返回所有匹配关键词的拼接字符串
若需要用逗号分隔匹配项:
dx['Check'] = dx['Names'].apply( lambda x: ', '.join([k for k in kw if k in x]) or None )
内容的提问来源于stack exchange,提问作者Teuku Ario Maulana
相关产品推荐
相关产品推荐

