Pandas DataFrame词频统计耗时过长,求优化方案
代码慢的原因及优化方案
原代码的核心问题
- 超大字符串拼接与拆分:
" ".join(df['objeto'])会把整列文本拼成一个巨型字符串,数据量大时不仅占用大量内存,拆分过程也会消耗极多时间。 - 停用词查询效率低:
stop_words是列表结构,每次判断word not in stop_words的时间复杂度是O(n),数据量大时累计开销极高。 - Python循环低效:手动遍历每个单词计数,Python原生循环处理大规模数据的效率远低于Pandas内置的向量化操作。
优化后的代码
import pandas as pd import nltk from unidecode import unidecode # 预处理文本列 df['objeto'] = df['objeto'].apply(unidecode.unidecode) df['objeto'] = df['objeto'].str.replace('[^\w\s]', '', regex=True) # 停用词转集合(查询效率从O(n)降至O(1)) stop_words = set(nltk.corpus.stopwords.words('portuguese')) stop_words.update(['12', 'termo', 'aquisicao', 'vinte', 'demandas']) # 拆分单词、转小写、展开为单行数据 word_series = df['objeto'].str.lower().str.split(expand=True).stack() # 过滤停用词并统计词频(Pandas内置方法为底层优化实现) word_counts = word_series[~word_series.isin(stop_words)].value_counts() # 输出结果 print("Top 10 高频词:") print(word_counts.head(10).to_dict()) print("\nTop 100 高频词:") for word, count in word_counts.head(100).items(): print(word, count)
封装为通用函数
def calculate_word_frequency(df, column_name, custom_stopwords=[], lang='portuguese'): # 复制原数据避免修改输入的DataFrame processed_df = df.copy() # 文本预处理:移除重音、清理标点符号 processed_df[column_name] = processed_df[column_name].apply(unidecode.unidecode) processed_df[column_name] = processed_df[column_name].str.replace('[^\w\s]', '', regex=True) # 构建高效查询的停用词集合 stop_words = set(nltk.corpus.stopwords.words(lang)) stop_words.update(custom_stopwords) # 拆分文本并展开为单个单词的序列 word_series = processed_df[column_name].str.lower().str.split(expand=True).stack() # 过滤停用词后统计词频 word_counts = word_series[~word_series.isin(stop_words)].value_counts() return word_counts # 使用示例 # counts = calculate_word_frequency(your_dataframe, 'target_column', ['custom_word1', 'custom_word2']) # print(counts.head(10))
额外提速建议
- 如果数据量特别大,可以使用
swifter库让apply操作并行化:df['objeto'] = df['objeto'].swifter.apply(unidecode.unidecode)。 - 若不需要保留原始数据,可直接在原DataFrame上操作,节省内存复制的开销。
内容的提问来源于stack exchange,提问作者Foroand
相关产品推荐
相关产品推荐

