如何用Pandas实现带正值保持的cumsum(不使用for循环)
从列'a'生成列'b'的Pandas实现
首先明确转换规则:
- 每一行的
b值 = 前一行b值 + 当前行a值,若结果>0则保留,否则设为0 - 首行
b值等价于初始值0加首行a值(1>0,故为1)
方法1:使用expanding().apply()(简洁直观)
这种方法逻辑清晰,适合小数据集:
import pandas as pd df = pd.DataFrame({'a': [1, 2, 0, 0, 0, -1, -5, 1, 1, 2, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 3, -2]}) def calculate_b(series): current_val = 0 for num in series: current_val += num current_val = max(current_val, 0) return current_val df['b'] = df['a'].expanding().apply(calculate_b)
方法2:Numba加速(高性能,适合大数据集)
如果数据集规模较大,用Numba编译循环能显著提升效率,需先安装numba(pip install numba):
import pandas as pd from numba import jit import numpy as np df = pd.DataFrame({'a': [1, 2, 0, 0, 0, -1, -5, 1, 1, 2, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 3, -2]}) @jit(nopython=True) def calculate_b_numba(a_array): result = np.zeros_like(a_array) current_val = 0 for i in range(len(a_array)): current_val += a_array[i] current_val = max(current_val, 0) result[i] = current_val return result df['b'] = calculate_b_numba(df['a'].values)
两种方法生成的b列均与你提供的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Nhân Phan Thành
相关产品推荐
相关产品推荐

