如何优化Pandas DataFrame批量应用get_freq函数的执行效率
优化方案:用字典查找+Pandas向量操作替代嵌套循环
问题根源
你的代码执行缓慢的核心原因是双重嵌套循环叠加每次查找都遍历整个df_freq:
- 外层嵌套循环遍历
df2的每个单元格,时间复杂度为O(M*N)(M是行数,N是列数) - 每个单元格调用
get_freq时,又要遍历df_freq所有行匹配单词,时间复杂度O(K)(K是df_freq行数) - 整体时间复杂度为O(MNK),数据量稍大就会出现严重卡顿。
优化步骤
1. 将频次表转为字典(实现O(1)快速查找)
先把df_freq转换成以单词为键、频次为值的字典,单次查找耗时变为常数级:
# 假设df_freq第一列是单词,第二列是频次 freq_dict = df_freq.set_index(df_freq.columns[0])[df_freq.columns[1]].to_dict() # 如果df_freq存在重复单词,先保留第一个匹配项(和原函数break逻辑一致) # df_freq = df_freq.drop_duplicates(subset=df_freq.columns[0], keep='first') # freq_dict = df_freq.set_index(df_freq.columns[0])[df_freq.columns[1]].to_dict()
2. 重构高效查找函数
用字典的get方法替代循环查找,找不到单词时可设置默认频次(示例用0,可按需调整):
def get_freq_fast(word): return [word, freq_dict.get(word, 0)]
3. 用Pandas向量操作批量替换
使用applymap批量处理df2所有单元格,Pandas内部做了性能优化,比手动嵌套循环效率高得多:
df2 = df2.applymap(get_freq_fast)
效果对比
优化后整体时间复杂度降至O(M*N),字典查找的常数耗时可忽略不计,处理速度会提升几十到上百倍,彻底解决5分钟耗时的问题。
内容的提问来源于stack exchange,提问作者Nykolai
相关产品推荐
相关产品推荐

