遍历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
相关产品推荐
相关产品推荐

