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

遍历Pandas DataFrame提速:百万行文本匹配优化求助

性能优化方案:从120天到几秒的质变

原代码慢到离谱的核心原因是双重嵌套循环——遍历DataFrame的4万多行时,每一行都要从头扫一遍110万行的文本文件,总操作量接近500亿次,不慢才怪。下面是几个高效的优化方案,优先选第一个,最快最省心。

最优方案:用字典做O(1)查找(推荐)

先把文本里的「单词-ID」映射提前存进字典,之后直接查字典就行,时间复杂度降到O(M+N),几秒就能跑完。

第一步:构建单词-ID字典

word_id_map = {}
with open('text.txt', 'r') as f:
    # 跳过第一行表头
    next(f)
    for line in f:
        # 按空格分割每行内容,自动处理多余空格
        parts = line.strip().split()
        if len(parts) >= 3:
            word = parts[2]
            word_id = parts[1]
            # 如果同一个单词出现多次,这里会保留最后一次的ID;要保留第一次的话,加个判断:if word not in word_id_map
            word_id_map[word] = word_id

第二步:批量更新DataFrame的ID列

用Pandas的map方法批量替换,比iterrows快N倍:

# 直接通过字典映射,没匹配到的单词会保留NaN
df['ID'] = df['Word'].map(word_id_map)

# 如果想把没匹配到的设为0,加个fillna:
# df['ID'] = df['Word'].map(word_id_map).fillna(0)

备选方案:用Pandas合并两个DataFrame

如果习惯用Pandas的表格操作,也可以把文本转成DataFrame后用merge合并,效率同样远高于原代码:

import pandas as pd

# 读取文本文件,指定分隔符为任意空白,跳过表头,自定义列名
text_df = pd.read_csv('text.txt', sep='\s+', skiprows=1, names=['NR', 'ID', 'WORD'])
# 按单词列合并,只保留需要的ID列
df = df.merge(text_df[['WORD', 'ID']], left_on='Word', right_on='WORD', how='left')
# 删掉多余的WORD列
df.drop('WORD', axis=1, inplace=True)

极端情况:用数据库(当前数据量没必要)

如果数据量再大几个量级(比如数亿行),可以用SQLite这类轻量数据库,把两个数据导入后做JOIN查询。但就现在的规模来说,前面两个方案完全够用,数据库反而有点画蛇添足。

内容的提问来源于stack exchange,提问作者LarsLill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:30:44