You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中无循环计算基于过往值乘积的累积列

如何高效计算DataFrame的累积概率乘积?

嘿,我来帮你解决这个循环性能问题!首先得明确你的需求:Cumulative列的每个值是从第0个时间段到当前时间段的前一个所有Single值的乘积(看你的示例就能发现,第0行的Cumulative是1.0,第1行是第0个Single的值,第2行是前两个Single的乘积,以此类推)。

你之前用iterrows()循环的方式,在数据量小的时候没问题,但数据量大时确实会慢到让人头疼——毕竟逐行遍历是pandas里效率最低的操作之一。

最优解决方案:用pandas内置的向量化函数

其实pandas早就为这种累积计算场景准备了专用函数:cumprod()(累积乘积),再配合shift()就能完美实现需求,完全不需要循环或者apply!

具体代码实现

先看你的示例DataFrame:

Single  Cumulative
0   0.990       1.000000
1   0.980       0.990000
2   0.970       0.970200
3   0.960       0.941094
4   0.950       0.903450
5   0.940       0.858278
6   0.930       0.806781
7   0.920       0.750306
8   0.910       0.690282
9   0.900       0.628157
10  0.890       0.565341

替换循环的一行代码就搞定:

df['Cumulative'] = df['Single'].cumprod().shift(fill_value=1.0)

原理解释

  1. df['Single'].cumprod():计算Single列的累积乘积,结果是从第0个元素开始依次相乘的序列,比如示例中这个结果的第0位是0.99,第1位是0.99*0.98=0.9702,第2位是0.99*0.98*0.97=0.941094,以此类推。
  2. .shift(fill_value=1.0):把上面的累积乘积序列整体向下移动一位,空出来的第一个位置用1.0填充——这正好对应你需要的Cumulative列:第0行是初始值1.0,第1行是第0个Single的乘积,第2行是前两个Single的乘积……完美匹配你的示例结果!

为什么这个方法更好?

  • 完全是向量化操作:pandas的内置函数都是用C语言实现的底层优化,比Python级别的循环快几个数量级,数据量越大优势越明显。
  • 代码简洁易读:一行代码就完成需求,不需要复杂的循环逻辑,后期维护也方便。

内容的提问来源于stack exchange,提问作者kevfefe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:08:26