如何优化Pandas中两个DataFrame值查找的嵌套循环逻辑
优化方案
你原来的代码慢核心原因是嵌套循环中每次都执行全表布尔匹配查找player_id对应值,属于O(n)级别的重复查找,数据量越大耗时越夸张。可以用以下完全向量化的方案替代,性能可以提升几十到上千倍:
实现步骤
- 先把
simresult设置player_id为索引,利用pandas索引的哈希查找特性,把单次查找耗时从O(n)降到O(1) - 一次性批量查找所有
skipper中player_id对应的分值,再按行维度求和,完全避免Python级别的嵌套循环
代码实现
import pandas as pd import numpy as np # 预处理:设置player_id为索引 sim_indexed = simresult.set_index('player_id') # 批量查找所有id对应的分值,重构成和skipper匹配的三维数组:[skipper行数, 每行id数, 分值列数] value_matrix = sim_indexed.reindex(skipper.stack()).values.reshape(skipper.shape[0], skipper.shape[1], 10) # 按行维度求和(即每行10个id的同列分值相加),保留2位小数 result = pd.DataFrame(value_matrix.sum(axis=1).round(2), columns=range(10))
可选轻量写法(可读性更高)
如果你的数据量不是特别大,也可以用字典映射的写法,逻辑更容易理解:
sim_indexed = simresult.set_index('player_id') result = pd.DataFrame() # 遍历0-9的分值列,批量替换+求和 for col in range(10): # 构建当前列的id-分值映射 col_map = sim_indexed[col].to_dict() # 把skipper中所有id替换为对应分值,按行求和 result[col] = skipper.replace(col_map).sum(axis=1).round(2)
内容的提问来源于stack exchange,提问作者Rory Burke
相关产品推荐
相关产品推荐

