Python如何优化pandas逐列计算累计最大值跳过零行的代码运行速度
优化方案
你当前使用的嵌套循环属于Python级逐元素迭代,存在极高的解释器开销,对于大尺寸DataFrame性能极差。你的需求本质是对每列的非0元素做非递减累计处理,可直接通过pandas内置向量化函数实现,完全避免Python层面的循环。
优化后代码
import pandas as pd # 原始DataFrame构造逻辑不变 df = pd.DataFrame({ 'A1': [118.0, 189.0, 154.0, 129.0, 0, 227.0, 208.0, 200.0, 733.0, 804.0, 861.0], 'A2': [108.0, 54.0, 122.0, 148.0, 0, 0, 0, 0, 838.0, 996.0, 987.0], 'A3': [70.0, 89.0, 107.0, 148.0, 0, 149.0, 241.0, 222.0, 825.0, 954.0, 1138.0], 'A4': [80.0, 40, 117.0, 158.0, 0, 0, 0, 0, 700, 899, 850] }) # 核心处理逻辑,一行完成全量计算 df = df.mask(df == 0).cummax().fillna(0).astype(df.dtypes)
逻辑说明
df.mask(df == 0):将所有值为0的位置临时替换为NaN,后续计算会自动跳过这些位置.cummax():按列计算累计最大值,天然满足「当前非0值小于前一个值则替换为前一个值」的要求.fillna(0):将之前临时替换为NaN的0值还原.astype(df.dtypes):可选步骤,保持处理后的数据类型和原始DataFrame完全一致
性能表现
对于你提到的(3000行, 1305列)尺寸的DataFrame,该方案耗时通常在100ms以内,相比原实现的1.5分钟有上千倍的性能提升,且输出结果和原嵌套循环实现完全一致。
验证结果
处理后的输出如下:
| 索引 | A1 | A2 | A3 | A4 |
|---|---|---|---|---|
| 0 | 118.0 | 108.0 | 70.0 | 80.0 |
| 1 | 189.0 | 108.0 | 89.0 | 80.0 |
| 2 | 189.0 | 122.0 | 107.0 | 117.0 |
| 3 | 189.0 | 148.0 | 148.0 | 158.0 |
| 4 | 0.0 | 0.0 | 0.0 | 0.0 |
| 5 | 227.0 | 0.0 | 149.0 | 0.0 |
| 6 | 227.0 | 0.0 | 241.0 | 0.0 |
| 7 | 227.0 | 0.0 | 241.0 | 0.0 |
| 8 | 733.0 | 838.0 | 825.0 | 700.0 |
| 9 | 804.0 | 996.0 | 954.0 | 899.0 |
| 10 | 861.0 | 996.0 | 1138.0 | 899.0 |
内容的提问来源于stack exchange,提问作者nikhil
相关产品推荐
相关产品推荐

