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

如何基于Pandas多级索引DataFrame按10%环比递推计算sc1/p1的qty值?

实现多级索引DataFrame中按复利递增填充qty值

假设你的多级索引DataFrame已经构造完成,以下两种方法可以实现需求:

方法一:循环赋值(逻辑直观,适合新手)

先定位目标组,然后逐个计算每个季度的qty值并赋值,每一步都基于前一个季度的值乘以1.1:

import pandas as pd

# 先构造示例DataFrame(如果已有可直接跳过这部分)
sc_list = ['sc1', 'sc2']
p_list = ['p1', 'p2']
yr_list = ['yr1', 'yr2', 'yr3']
q_list = ['q1', 'q2', 'q3', 'q4']

multi_index = pd.MultiIndex.from_product(
    [sc_list, p_list, yr_list, q_list],
    names=['sc', 'p', 'yr', 'q']
)
df = pd.DataFrame({'qty': 0.0}, index=multi_index)

# 设置初始值:sc1/p1/yr1/q1的qty为10
df.loc[('sc1', 'p1', 'yr1', 'q1'), 'qty'] = 10

# 定位sc1/p1组下需要填充的所有季度(yr1/q2到yr3/q4)
target_group = ('sc1', 'p1')
group_indices = df.xs(target_group, level=['sc', 'p']).index
# 取q1之后的所有索引(假设索引已按yr/q排序)
fill_indices = group_indices[1:]

# 循环计算并赋值
current_qty = df.loc[target_group + ('yr1', 'q1'), 'qty']
for yr_q in fill_indices:
    current_qty *= 1.1
    df.loc[target_group + yr_q, 'qty'] = current_qty

# 查看结果
print(df.loc[target_group])

方法二:向量化操作(高效处理大数据)

用numpy的向量化计算直接生成整个增长序列,避免循环,适合数据量较大的场景:

import pandas as pd
import numpy as np

# 构造/加载你的DataFrame(同方法一)
# ...

target_group = ('sc1', 'p1')
# 取出目标组数据并确保按年份、季度排序
group_df = df.xs(target_group, level=['sc', 'p']).sort_index()

# 获取初始值,生成复利增长序列
initial_val = group_df['qty'].iloc[0]
# 生成每个位置的增长幂次:第1个值对应0次幂(初始值),第2个对应1次幂,以此类推
power = np.arange(len(group_df))
growth_vals = initial_val * (1.1 ** power)

# 将计算结果赋值回原DataFrame
df.loc[target_group] = growth_vals.values.reshape(-1, 1)

# 查看结果
print(df.loc[target_group])

注意事项

  • 如果你的多级索引结构不同(比如yr/q是外层索引),只需调整xs方法的level参数和索引定位逻辑即可,核心的复利计算逻辑不变。
  • 若需要限制小数位数,可以在计算时加入round函数,比如current_qty = round(current_qty * 1.1, 2)或者growth_vals = np.round(initial_val * (1.1 ** power), 2)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:48:22