如何在Pandas中实现自定义逐行累积计算(非循环方式)
Pandas自定义逐行累积计算的高效实现方法
Pandas原生的逐行累积函数仅包含cummin、cummax、cumsum、cumprod,针对自定义累积逻辑(如下一行结果 = 当前行原始值 + 上一行结果的1/2),除了低效的逐行循环外,有两种更高效的实现方式:
示例场景的循环实现
先明确需求对应的原循环代码:
import pandas as pd df = pd.DataFrame({"A":[1,2,3]}) for i in range(1, len(df)): df.loc[i, "A"] = df.loc[i, "A"] + df.loc[i-1, "A"]*1/2
执行后df['A']结果为[1, 2.5, 4.25]。
方法一:数学公式推导(向量化实现)
先拆解递推逻辑的数学规律:
设原始序列为a₀, a₁, a₂,结果序列为x₀, x₁, x₂,则:
x₀ = a₀x₁ = a₁ + 0.5*x₀ = a₁ + 0.5*a₀x₂ = a₂ + 0.5*x₁ = a₂ + 0.5*a₁ + (0.5)²*a₀
以此类推,xₙ是原始序列与等比权重序列[1, 0.5, (0.5)², ..., (0.5)ⁿ]的卷积结果。
用Pandas+Numpy实现:
import pandas as pd import numpy as np df = pd.DataFrame({"A":[1,2,3]}) # 生成等比权重数组,长度与原始序列一致 weights = (0.5) ** np.arange(len(df)) # 计算卷积并截取有效结果 df['A'] = np.convolve(df['A'], weights, mode='full')[:len(df)]
该方法完全向量化,避免了循环,适合可推导数学规律的自定义累积场景。
方法二:Numba JIT编译加速循环
如果递推逻辑复杂到无法推导公式,可借助Numba对循环进行JIT编译,大幅提升执行效率(速度接近纯C代码):
import pandas as pd from numba import jit import numpy as np @jit(nopython=True) def custom_cumulative(arr): result = np.empty_like(arr) result[0] = arr[0] for i in range(1, len(arr)): result[i] = arr[i] + result[i-1] * 0.5 return result df = pd.DataFrame({"A":[1,2,3]}) df['A'] = custom_cumulative(df['A'].values)
此方法保留了原循环的逻辑直观性,同时解决了Pandas逐行循环效率低下的问题。
内容的提问来源于stack exchange,提问作者PierXuY
相关产品推荐
相关产品推荐

