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

