如何在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
相关产品推荐
相关产品推荐

