DataFrame指定列每3个单元格累加代码无法终止问题排查
运行无法结束的核心原因
- 执行效率极低:你的代码用了Python原生双层循环遍历DataFrame,配合
iloc逐元素赋值,pandas的行级遍历本身比向量化操作慢100~1000倍,你的数据有80万行、48列需要计算,总操作量超过3800万次,自然会出现长时间无响应的情况。 - 循环逻辑冗余:当前循环步长默认为1,即使需求是每3行一组计算,你也会重复处理行数据,总循环次数是实际需要的3倍,进一步拉长运行时间。
- 原地修改开销大:直接在原DataFrame上修改元素,会触发pandas的索引校验、数据拷贝等内部操作,额外增加运行开销。
优化方案
临时修复(不改逻辑仅提速)
如果需要保留原有的循环逻辑,先把循环步长改为3,减少无效循环:
# 步长设为3,按不重叠的3行分组处理 for row in range(0, len(dataframe5.index)-2, 3): if dataframe5.iloc[row, 5] == dataframe5.iloc[row+1, 5] and dataframe5.iloc[row, 5] == dataframe5.iloc[row+2, 5] and \ dataframe5.iloc[row, 1] == dataframe5.iloc[row+1, 1] and dataframe5.iloc[row, 1] == dataframe5.iloc[row+2, 1]: for i in range(6, len(dataframe5.columns)): dataframe5.iloc[row, i] = dataframe5.iloc[row, i] + dataframe5.iloc[row+1, i] + dataframe5.iloc[row+2, i]
最优解决方案(向量化操作,提速百倍)
完全替换循环逻辑,用pandas自带的分组聚合能力实现需求,80万行数据仅需数秒即可跑完:
# 构造分组标识:按第1列、第5列分组后,组内每3行划为一个子分组 dataframe5['sub_group'] = dataframe5.groupby([1,5]).cumcount() // 3 # 对第6列开始的所有列,按分组求和 result = dataframe5.groupby([1,5,'sub_group'], as_index=False).agg({col: 'sum' for col in range(6, len(dataframe5.columns))})
如果需要保留其他列的原始值,自行调整agg规则即可。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

