You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas实现两个DataFrame关键词匹配及分类统计?

实现句子与关键词匹配并按大类统计数量

需求梳理

现有两个DataFrame:

  • sentence:存储待匹配的句子
  • db_keyword:存储分类关键词,lv1是大类,lv2是具体关键词

需要完成:每个句子匹配lv2关键词,按lv1大类统计该句子匹配到的关键词数量,最终把统计结果和原句子合并。

实现代码

import pandas as pd

# 示例数据
sentence = pd.DataFrame({'sentence':['I like to go to starbucks', 'I do not like coffee', 'how can i sign in instagram', 'gift']})
db_keyword = pd.DataFrame({'lv1':['event', 'event', 'event', 'gift', 'gift'],
                         'lv2':['event', 'starbucks', 'instagram', 'gift', 'voucher'],
                         })

# 1. 把关键词按lv1大类分组,生成{大类: [关键词列表]}的字典
keyword_groups = db_keyword.groupby('lv1')['lv2'].apply(list).to_dict()

# 2. 定义函数:统计单个句子在每个大类下匹配到的关键词数量
def count_matches(sent):
    result = {}
    for lv1, keywords in keyword_groups.items():
        # 统计句子中包含的当前大类下的关键词个数(大小写不敏感)
        match_count = sum(1 for kw in keywords if kw.lower() in sent.lower())
        result[lv1] = match_count
    return pd.Series(result)

# 3. 对每个句子应用函数,合并结果到原DataFrame
result_df = sentence.join(sentence['sentence'].apply(count_matches))

print(result_df)

输出结果

运行后会得到:

sentence  event  gift
0  I like to go to starbucks      1     0
1       I do not like coffee      0     0
2  how can i sign in instagram      1     0
3                        gift      0     1

大数据量优化方案

如果实际数据量极大,上述循环遍历关键词的方式效率偏低,可以改用正则表达式批量匹配:

import re

# 把每个大类的关键词拼成正则匹配式
keyword_regex = {lv1: '|'.join(keywords) for lv1, keywords in keyword_groups.items()}

def count_matches_regex(sent):
    result = {}
    sent_lower = sent.lower()
    for lv1, pattern in keyword_regex.items():
        # 用正则统计匹配到的关键词数量
        matches = len(re.findall(pattern, sent_lower))
        result[lv1] = matches
    return pd.Series(result)

result_df = sentence.join(sentence['sentence'].apply(count_matches_regex))

内容的提问来源于stack exchange,提问作者kh.y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:20:43