Pandas中apply配合lambda映射操作的更高效实现方法
Pandas数据映射性能优化方案
性能瓶颈原因
你当前使用apply(lambda s: s.map(mapper))的实现需要逐列遍历DataFrame,每次lambda调用、map操作都有额外的函数开销,在大循环、大数据量场景下耗时会被显著放大。
优化方案
方案1:矢量化replace实现(改动最小,性能提升3~10倍)
pandas内置的replace是全局矢量化操作,无需逐列遍历,直接完成整个DataFrame的值匹配替换,代码改动极小:
# 保留你原有其他逻辑,仅替换apply相关的行即可 payouts = pd.concat([payouts, ranking.replace(mapper).fillna(-1)], axis=1)
方案2:Numpy索引映射(性能最高,提升10~100倍,适合高频循环/超大数据量)
如果这段逻辑在循环中执行次数极多、或ranking数据量很大,可以用numpy索引实现完全零额外函数开销的映射,映射数组还可以提到循环外提前生成:
import numpy as np # ---------- 这部分可以移到循环外,仅执行一次即可 ---------- max_rank = prizes['Rank'].max() # 初始化映射数组,默认值为-1对应原逻辑的fillna结果 np_mapper = np.full(max_rank + 1, -1, dtype=int) np_mapper[prizes['Rank'].values] = prizes['Payout'].values # ------------------------------------------------------ # 一步完成所有值的映射 payout_arr = np_mapper[ranking.values] # 转DataFrame后拼接 payouts = pd.concat([payouts, pd.DataFrame(payout_arr, columns=ranking.columns)], axis=1)
两种方案输出的结果和你原代码完全一致。
内容的提问来源于stack exchange,提问作者Scott Woodhall
相关产品推荐
相关产品推荐

