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

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)

计算结果校验

处理后的数据完全符合规则要求,核心填充值结果如下:

RegionCountryProductYearPrice
AfricaSouth AfricaABC2018417.20
AfricaSouth AfricaXYZ2017759.60
AfricaSouth AfricaXYZ2018769.32
AsiaJapanDEF2018460.13

注:连续0值会自动基于前序计算结果递推,比如南非XYZ产品2018年值就是基于2017年的填充值759.6计算得出,符合需求规则。

注意事项

  • 代码默认每个「国家+产品」分组的最早年度为非0值,存在可用于递推的初始基准价格。如果存在首年价格为0的场景,需要提前补充对应基准值后再运行计算。
  • 逐行递推的逻辑支持任意长度的连续0值计算,不会出现向量化填充常见的连续缺失值断层问题。

内容的提问来源于stack exchange,提问作者A.N.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:27:23