如何从Python Pandas DataFrame的文本列中匹配提取指定列表关键词
实现方法
已知条件
- 待匹配的带空格关键词列表:
lst = ["apple pie", "chocolate shakes", "orange juice"]
- 待处理DataFrame包含
Explanation文本列,样例结构:
| 索引 | Explanation |
|---|---|
| a | apple pie is my favorite dessert |
| b | I love chocolate. But I love chocolate shakes more. |
| c | she is allergic to orange juice |
- 目标:新增
Explanation Extracted列,存储每条文本中匹配到的列表内关键词,最终效果:
| 索引 | Explanation | Explanation Extracted |
|---|---|---|
| a | apple pie is my favorite dessert | apple pie |
| b | I love chocolate. But I love chocolate shakes more. | chocolate shakes |
| c | she is allergic to orange juice | orange juice |
代码实现
因为关键词本身包含空格,不能用常规分词后比对的方式,直接用正则做整词匹配是最稳妥的方案,同时兼容关键词存在包含关系的场景:
import re import pandas as pd # 1. 预处理关键词:按长度倒序,避免短词优先匹配截断长词;转义特殊正则字符 keywords = sorted(lst, key=lambda x: len(x), reverse=True) match_pattern = re.compile( r"\b(" + "|".join(map(re.escape, keywords)) + r")\b" ) # 2. 示例数据构造(使用自有现有df可跳过这步) df = pd.DataFrame( { "Explanation": [ "apple pie is my favorite dessert", "I love chocolate. But I love chocolate shakes more.", "she is allergic to orange juice" ] }, index=["a", "b", "c"] ) # 3. 批量提取匹配结果 df["Explanation Extracted"] = df["Explanation"].apply( lambda text: match_pattern.search(text).group() if match_pattern.search(text) else None )
细节说明
- 正则里加
\b单词边界,是为了避免误匹配单词片段,比如不会把apple pies里的apple pie当成匹配结果 - 关键词按长度倒序排序,是为了处理关键词存在包含关系的场景——比如如果列表里同时有
chocolate和chocolate shakes,会优先匹配更长的完整关键词,不会只匹配到短词 - 如果单条文本可能命中多个关键词,把
search替换为findall即可,提取结果会以列表形式存储所有命中的关键词:
# 多关键词命中场景的写法 df["Explanation Extracted"] = df["Explanation"].apply( lambda text: match_pattern.findall(text) )
运行后打印df即可得到目标结果。
内容的提问来源于stack exchange,提问作者ehkhacha
相关产品推荐
相关产品推荐

