将Pandas迭代从iterrows改为apply/向量化格式以优化性能
Pandas代码优化方案:替代iterrows实现分组填充逻辑
核心思路
利用Pandas内置的分组+向量化填充方法,替代逐行迭代的iterrows,彻底解决性能问题。逻辑完全匹配需求:按(ITEMSALE, ITEMID)分组,对rank=1的行,用同分组同列的下一个可用非空值填充空值,覆盖所有列。
优化代码实现
import pandas as pd # 假设原数据集为df,包含ITEMSALE、ITEMID、rank及其他业务列 # 步骤1:分组后对每列执行向后填充,提取处理后的rank=1行 filled_rank1_rows = df.groupby(['ITEMSALE', 'ITEMID'], group_keys=False).apply( lambda group: group.bfill().loc[group['rank'] == 1] ) # 步骤2:替换原数据中rank=1的行 df.loc[df['rank'] == 1, :] = filled_rank1_rows
代码说明
groupby+bfill():bfill()是Pandas内置的向后填充方法,会自动为每个分组内的空值填充该列后续第一个非空值,全程为向量化操作,性能远高于Python循环。- 提取rank=1行:分组处理后直接筛选
rank=1的行,得到所有分组中已完成空值填充的目标行。 - 批量替换:通过布尔索引定位原数据中
rank=1的行,批量替换为处理后的结果,避免逐行赋值的开销。
性能优势
iterrows本质是Python层面的逐行循环,数据量达到万级以上时会出现明显卡顿;而上述方案基于Pandas的C语言底层实现,处理速度可提升数十倍甚至上百倍,数据量越大优势越显著。
内容的提问来源于stack exchange,提问作者VIDYA RENUKA
相关产品推荐
相关产品推荐

