Python Pandas如何按列唯一值分组实现累计求和(无需for循环)
Pandas按分组计算累计值的无循环实现
需求场景
现有如下结构的交易收益DataFrame,行索引为交易日期date:
df account PnL date 2022-01-01 1 100 2022-01-01 2 30 2022-01-02 1 -5 2022-01-02 2 10 2022-01-03 1 10 2022-01-03 2 5
需要新增cumulative_PnL列,按account账户分组计算每组PnL列的累计求和值,禁止使用显式for循环,采用符合Python风格的写法实现,最终预期结果如下:
df account PnL cumulative_PnL date 2022-01-01 1 100 100 2022-01-01 2 30 30 2022-01-02 1 -5 95 2022-01-02 2 10 40 2022-01-03 1 10 105 2022-01-03 2 5 45
实现代码
直接使用pandas内置的分组累计求和接口即可,一行代码完成需求:
df['cumulative_PnL'] = df.groupby('account')['PnL'].cumsum()
实现逻辑说明
groupby('account')会按照账户字段对数据做逻辑分组,不需要手动遍历每个分组对象- 分组后选取
PnL列调用cumsum()累计求和方法,计算结果会自动和原DataFrame的行索引对齐,不需要额外做表合并、索引重置操作 - 整个计算为pandas底层实现的向量化运算,执行效率远高于手写for循环,是pandas官方推荐的标准写法
前置校验:执行上述代码前请确认DataFrame已经按
date日期升序排列,否则累计求和的顺序会和预期不符。如果数据未排序,可以先执行排序操作:df = df.sort_values(['account', 'date'])
内容的提问来源于stack exchange,提问作者MathMan 99
相关产品推荐
相关产品推荐

