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

如何在Pandas中用groupby+apply计算2024-2026年产品价格

解决方案:用groupby+apply计算产品逐年价格

核心思路

你需要按**单个产品(Product)**分组,而非年份+产品的组合分组——因为跨年份的价格计算是基于同一产品的历史数据,单个年份+产品的分组无法实现跨年度的递推计算。

方法一:高效的累积乘积实现

这种方式利用Pandas的cumprod()方法替代循环,代码更简洁高效:

import pandas as pd
import numpy as np

# 初始化数据
cena_dict = {
    "Product" : ["Apple","Orange","Apple","Orange","Apple","Orange","Apple","Orange"],
    "Price" : [1,2,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN],
    "Rok" : [2023,2023,2024,2024,2025,2025,2026,2026],
    "CPI" : [10.4, 10.4 ,9 ,9 , 8.6 ,8.6 ,5.4 ,5.4]
}

df = pd.DataFrame(cena_dict)

# 定义分组处理函数
def compute_prices(group):
    # 按年份排序,确保计算顺序正确
    sorted_group = group.sort_values("Rok")
    # 计算年度通胀乘数
    inflation_multiplier = 1 + sorted_group["CPI"] / 100
    # 用初始价格填充NaN,再乘以通胀乘数的累积乘积
    sorted_group["Price"] = sorted_group["Price"].ffill() * inflation_multiplier.cumprod()
    return sorted_group

# 分组应用函数并合并结果
result_df = df.groupby("Product", group_keys=False).apply(compute_prices)

print(result_df)

方法二:模拟原循环逻辑的实现

如果你更倾向于沿用原循环的思路,也可以在分组后的函数内写循环:

def compute_prices_with_loop(group):
    sorted_group = group.sort_values("Rok").reset_index(drop=True)
    # 逐行递推计算价格
    for i in range(1, len(sorted_group)):
        sorted_group.loc[i, "Price"] = sorted_group.loc[i-1, "Price"] * (1 + sorted_group.loc[i, "CPI"] / 100)
    return sorted_group

result_df = df.groupby("Product", group_keys=False).apply(compute_prices_with_loop)

结果说明

两种方法都会得到相同的计算结果:

  • Apple的2024-2026年价格依次为1.09、≈1.1837、≈1.2477
  • Orange的2024-2026年价格依次为2.18、≈2.3675、≈2.4953

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:11:30