如何高效统计DataFrame中指定单词在对应句子中的出现频率?
问题分析
你的原代码之所以运行极慢,核心问题是双重循环的时间复杂度爆炸:你把所有句子拆分成列表后,遍历每一个单词去和所有句子匹配——50k行的话就是50k×50k=25亿次操作,这完全超出了合理的计算范围。
正确的思路应该是逐行处理:每一行只需要统计当前word在对应Sentence中的出现次数,而不是让所有句子和所有单词交叉配对。
高效解决方案
下面提供两种可靠的实现方式,都能轻松处理50k行的数据集:
方法1:准确的单词级计数(推荐)
这个方法会先清理句子中的标点,确保像day!和day被视为同一个单词,然后统计目标单词的出现次数:
import pandas as pd import re from collections import Counter def count_target_word(row): # 清理句子:移除标点、转小写,避免大小写和标点干扰 cleaned_sentence = re.sub(r'[^\w\s]', '', row['Sentence']).lower() # 拆分句子为单词列表并统计词频 word_counts = Counter(cleaned_sentence.split()) # 返回目标单词的计数(转小写匹配) return word_counts.get(row['word'].lower(), 0) # 给DataFrame新增计数列 df['n'] = df.apply(count_target_word, axis=1)
方法2:简化版(适合无标点干扰的场景)
如果你的数据里句子和单词的标点已经统一(比如单词不带标点,句子里的标点也不影响单词识别),可以用更简洁的写法:
import pandas as pd import re def count_target_word(row): # 拆分句子为单词,同时清理每个单词的标点 sentence_words = [re.sub(r'[^\w]', '', word) for word in row['Sentence'].split()] # 统计目标单词的出现次数 return sentence_words.count(row['word']) df['n'] = df.apply(count_target_word, axis=1)
为什么这个方法快?
逐行处理的时间复杂度是O(N×K),其中N是行数(50k),K是每个句子的平均单词数(通常几十),总操作数只有几百万次,比原代码的25亿次快了上千倍,完全能在几秒内跑完。
验证结果
用你提供的示例数据测试,两种方法都会得到你期望的输出:
| Sentence | word | n |
|---|---|---|
| "Such a day! It's a beautiful day out there" | "beautiful" | 1 |
| "Such a day! It's a beautiful day out there" | "day" | 2 |
| "I am sad by the sad weather" | "weather" | 1 |
| "I am sad by the sad weather" | "sad" | 2 |
内容的提问来源于stack exchange,提问作者Onik Rahman




