Pandas按增长率公式结合前序值填充DataFrame Price列0值
Pandas 按递推规则填充价格表0值实现方法
核心逻辑说明
- 先关联两张表,给主价格表匹配上对应「区域+产品」维度的年均增长率,避免计算过程中反复查表
- 按「国家+产品」维度分组,组内按年度升序排序,保证时间递推顺序正确
- 逐组逐行遍历:非0价格直接保留原值;遇到0值时,取上一行的最终价格(不管是原始值还是之前递推算出的填充值),按公式
填充值 = 上一年价格 * (1 + 对应年均增长率)计算填充 - 计算完成后删除临时关联的增长率辅助列即可
完整可运行代码
import pandas as pd # 构造样例数据 data1 = {'Region': ['Africa','Africa','Africa','Africa','Africa','Africa','Africa','Africa','Asia','Asia','Asia','Asia'], 'Country': ['South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','Japan','Japan','Japan','Japan'], 'Product': ['ABC','ABC','ABC','ABC','XYZ','XYZ','XYZ','XYZ','DEF','DEF','DEF','DEF'], 'Year': [2016, 2017, 2018, 2019,2016, 2017, 2018, 2019,2016, 2017, 2018, 2019], 'Price': [500, 400, 0,450,750,0,0,890,500,470,0,415]} data2 = {'Region': ['Africa','Africa','Africa','Asia','Asia','Asia'], 'Product': ['ABC','DEF','XYZ','XYZ','ABC','DEF'], 'Average Yearly Price Growth': [0.043, 0.071, 0.0128,0.05,0.009,-0.021]} df = pd.DataFrame(data1) df2 = pd.DataFrame(data2) # 1. 关联增长率到主表 df = df.merge(df2, on=['Region', 'Product'], how='left') # 2. 提前按分组维度+年度排序,保证递推顺序正确 df = df.sort_values(by=['Country', 'Product', 'Year']).reset_index(drop=True) # 3. 按国家+产品分组递推填充0值 for (country, product), group in df.groupby(['Country', 'Product']): # 拿到当前组在原df的索引位置,方便回写值 group_idx = group.index # 逐行遍历组内数据 for i in range(1, len(group_idx)): current_pos = group_idx[i] prev_pos = group_idx[i-1] # 当前值为0才需要填充 if df.loc[current_pos, 'Price'] == 0: prev_price = df.loc[prev_pos, 'Price'] growth = df.loc[current_pos, 'Average Yearly Price Growth'] df.loc[current_pos, 'Price'] = prev_price * (1 + growth) # 4. 删除临时辅助列,还原表结构 df = df.drop(columns=['Average Yearly Price Growth']) # 可选:按常规维度排序输出 df = df.sort_values(by=['Region', 'Country', 'Product', 'Year']).reset_index(drop=True)
计算结果校验
处理后的数据完全符合规则要求,核心填充值结果如下:
| Region | Country | Product | Year | Price |
|---|---|---|---|---|
| Africa | South Africa | ABC | 2018 | 417.20 |
| Africa | South Africa | XYZ | 2017 | 759.60 |
| Africa | South Africa | XYZ | 2018 | 769.32 |
| Asia | Japan | DEF | 2018 | 460.13 |
注:连续0值会自动基于前序计算结果递推,比如南非XYZ产品2018年值就是基于2017年的填充值759.6计算得出,符合需求规则。
注意事项
- 代码默认每个「国家+产品」分组的最早年度为非0值,存在可用于递推的初始基准价格。如果存在首年价格为0的场景,需要提前补充对应基准值后再运行计算。
- 逐行递推的逻辑支持任意长度的连续0值计算,不会出现向量化填充常见的连续缺失值断层问题。
内容的提问来源于stack exchange,提问作者A.N.
相关产品推荐
相关产品推荐

