Pandas列表关键词匹配问题:提取带后缀的前缀关键词至新列
问题分析
你需要实现前缀匹配:仅当col_one的字符串以list20中的关键词为开头(关键词后可跟任意字符)时,将对应关键词填入新列,且需优先匹配最长的关键词(比如WHAUP要优先于WHA,避免短关键词提前匹配)。
原代码的核心问题:
- 未限制匹配必须从字符串开头开始,导致非前缀的关键词也会被匹配
- 未处理关键词优先级,短关键词会优先于长关键词被匹配(比如
WHAUP会被错误匹配为WHA) - 部分代码只是检查关键词是否存在于字符串中,而非前缀匹配
正确解决方案
步骤1:先对关键词列表排序
将list20按关键词长度降序排序,确保长关键词先被匹配,避免短关键词抢占匹配:
sorted_list = sorted(list20, key=lambda x: -len(x))
方法1:使用Pandas字符串提取(推荐,效率更高)
利用正则^符号限制匹配开头,结合排序后的关键词构建正则表达式:
import pandas as pd list20 = ['ZEN', 'OOP', 'WICE', 'XO', 'WP', 'K', 'WGE', 'YGG', 'W', 'YUASA', 'XPG', 'ABC', 'WHA', 'WHAUP', 'WFX', 'WINNER', 'WIIK', 'WIN', 'YONG', 'WPH', 'KCE'] data = {"col_one": ["ZEN", "WPH", "WICE", "YONG", "K", "XO", "WIN", "WP", "WIIK", "YGG-W1", "W-W5", "WINNER", "YUASA", "WGE", "WFX", "XPG", "WHAUP", "WHA", "KCE13P2302A", "OOP-R"]} df = pd.DataFrame(data) # 按关键词长度降序排序 sorted_list = sorted(list20, key=lambda x: -len(x)) # 构建前缀匹配正则 pattern = f"^({'|'.join(sorted_list)})" # 提取匹配的前缀关键词 df['new_col'] = df['col_one'].str.extract(pattern)[0]
方法2:自定义匹配函数(逻辑更直观)
通过startswith检查前缀,遍历排序后的关键词:
import pandas as pd list20 = ['ZEN', 'OOP', 'WICE', 'XO', 'WP', 'K', 'WGE', 'YGG', 'W', 'YUASA', 'XPG', 'ABC', 'WHA', 'WHAUP', 'WFX', 'WINNER', 'WIIK', 'WIN', 'YONG', 'WPH', 'KCE'] data = {"col_one": ["ZEN", "WPH", "WICE", "YONG", "K", "XO", "WIN", "WP", "WIIK", "YGG-W1", "W-W5", "WINNER", "YUASA", "WGE", "WFX", "XPG", "WHAUP", "WHA", "KCE13P2302A", "OOP-R"]} df = pd.DataFrame(data) # 按关键词长度降序排序 sorted_list = sorted(list20, key=lambda x: -len(x)) def match_prefix(string): for keyword in sorted_list: if string.startswith(keyword): return keyword return 'na' # 无匹配时返回值 df['new_col'] = df['col_one'].apply(match_prefix)
最终输出结果
两种方法都会得到符合预期的结果:
| col_one | new_col |
|---|---|
| ZEN | ZEN |
| WPH | WPH |
| WICE | WICE |
| YONG | YONG |
| K | K |
| XO | XO |
| WIN | WIN |
| WP | WP |
| WIIK | WIIK |
| YGG-W1 | YGG |
| W-W5 | W |
| WINNER | WINNER |
| YUASA | YUASA |
| WGE | WGE |
| WFX | WFX |
| XPG | XPG |
| WHAUP | WHAUP |
| WHA | WHA |
| KCE13P2302A | KCE |
| OOP-R | OOP |
内容的提问来源于stack exchange,提问作者T_Ner
相关产品推荐
相关产品推荐

