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

Pandas DataFrame词频统计耗时过长,求优化方案

代码慢的原因及优化方案

原代码的核心问题

  1. 超大字符串拼接与拆分:" ".join(df['objeto'])会把整列文本拼成一个巨型字符串,数据量大时不仅占用大量内存,拆分过程也会消耗极多时间。
  2. 停用词查询效率低:stop_words是列表结构,每次判断word not in stop_words的时间复杂度是O(n),数据量大时累计开销极高。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:02:38