Pandas DataFrame关键词匹配新增列 多匹配取首项并汇总值问题
需求说明
- 为Pandas DataFrame新增匹配列:基于
description列的文本内容,从预定义关键词列表中匹配对应值,若单条文本匹配到多个关键词,仅取文本中第一个出现的匹配关键词填入新列 - 完成新列添加后,按唯一匹配关键词对
value列的数值做求和汇总
现有代码问题
当前实现无法满足需求的核心原因:
- 用
str.findall()会提取单条文本中所有匹配到的关键词,后续转集合再拼接的逻辑既无序,也保留了所有匹配结果,无法实现「仅取首个匹配项」的要求 - 多关键词拼接的字符串会被
groupby识别为独立分组,无法得到按单个关键词汇总的正确结果
简洁实现方案
直接使用Pandas字符串方法的str.extract()即可,该方法默认返回正则匹配到的第一个结果,天然符合「取首个匹配项」的要求,代码更简洁:
import pandas as pd import re kw = ['alpha', 'beta', 'theta', 'delta'] data = { 'description':['This text contains alpha', 'Here are delta & beta', 'It is beta', 'Another Alpha', 'sometimes Theta too', 'One more BETA'], 'value': [100,200,300,400,500,600] } df = pd.DataFrame(data) # 大小写不敏感匹配文本中第一个出现的关键词 df['keys'] = df['description'].str.extract(fr'({"|".join(kw)})', flags=re.IGNORECASE).str.lower() print("新增匹配列后的结果:") print(df, '\n') # 按关键词对value求和 df_sum = df.groupby('keys', as_index=False)['value'].sum() print("关键词汇总求和结果:") print(df_sum)
运行输出如下:
新增匹配列后的结果: description value keys 0 This text contains alpha 100 alpha 1 Here are delta & beta 200 delta 2 It is beta 300 beta 3 Another Alpha 400 alpha 4 sometimes Theta too 500 theta 5 One more BETA 600 beta 关键词汇总求和结果: keys value 0 alpha 500 1 beta 900 2 delta 200 3 theta 500
实现说明:
- 正则匹配加
re.IGNORECASE标记直接支持大小写不敏感匹配,不需要提前将整列文本转为小写str.extract()按文本从左到右的扫描顺序返回第一个命中的关键词,不需要额外编写取首项、去重的逻辑- 分组时指定
as_index=False可以避免把分组列设为索引,输出格式更规整
内容的提问来源于stack exchange,提问作者Roy42
相关产品推荐
相关产品推荐

