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

如何在Pandas DataFrame中按分组基于上一行值计算带百分比的数值?

解决Pandas分组递推计算Value的问题

核心思路

按指定维度分组后,通过计算增长因子的累积乘积,结合分组初始Value完成递推计算,全程用向量化操作避免循环。

步骤实现

假设你的DataFrame包含Year、Regions、Products、Subproducts、Pct、Value列(初始年份的Value已知,后续年份为待计算值):

  1. 排序确保计算顺序
    先按分组键和年份升序排列,保证每个组内数据按时间顺序处理:

    df = df.sort_values(['Regions', 'Products', 'Subproducts', 'Year'])
    
  2. 提取分组初始Value
    获取每个分组最早年份的Value作为计算基数:

    initial_vals = df.groupby(['Regions', 'Products', 'Subproducts'])['Value'].transform('first')
    
  3. 构建增长因子序列
    将Pct转换为增长因子(1 + Pct),初始年份无Pct的行填充为1(不影响初始值):

    df['growth_factor'] = df['Pct'].fillna(0) + 1
    
  4. 计算分组累积增长因子
    对每个分组的增长因子计算累积乘积,得到从初始年份到当前年份的总增长倍数:

    df['cumulative_growth'] = df.groupby(['Regions', 'Products', 'Subproducts'])['growth_factor'].transform('cumprod')
    
  5. 推导当年Value
    用初始Value乘以累积增长因子,得到每个年份的计算值:

    df['Value'] = initial_vals * df['cumulative_growth']
    

示例验证

用你给出的场景测试:

import pandas as pd
import numpy as np

data = {
    'Year': [2003,2003,2004,2004],
    'Regions': ['X','Y','X','Y'],
    'Products': ['P','Q','P','Q'],
    'Subproducts': ['S1','S2','S1','S2'],
    'Pct': [np.nan,np.nan,0.5,0.4],
    'Value': [34,20,np.nan,np.nan]
}
df = pd.DataFrame(data)

执行上述步骤后,2004年的Value会正确计算为51和28,完全匹配你的需求。

注意事项

  • 确保每个分组至少有一个非空的初始Value(最早年份的Value)
  • 如果初始年份不是数据中的最小年份,可将transform('first')替换为对应年份的取值逻辑,例如:transform(lambda x: x[df.loc[x.index, 'Year'] == 2003].iloc[0])
  • 计算完成后可删除临时列:df = df.drop(['growth_factor','cumulative_growth'], axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:18:58