如何用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
相关产品推荐
相关产品推荐

