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

如何用Pandas计算MultiIndex层级起始值的累积差值?

解决MultiIndex分组中各值与组起始值的差值计算问题

我完全懂你的需求——你要的不是相邻行的连续差值(diff()的效果),而是每个MultiIndex第一级分组里的所有值,和该组第一个起始值的差值,用来观察起始后的衰减情况对吧?之前的方法确实没命中点,我来给你个精准的解决方案。

步骤1:构造匹配需求的示例数据

先把你描述的示例数据建出来,方便验证效果:

import pandas as pd

# 创建MultiIndex结构
multi_idx = pd.MultiIndex.from_tuples(
    [('A', 1), ('A', 2), ('A', 3), ('A', 4),
     ('B', 1), ('B', 2), ('B', 3), ('B', 4)],
    names=['group', 'seq']
)
# 生成对应DataFrame
df = pd.DataFrame(
    {'values': [120, 100, 90, 50, 11, 12, 10, 9]},
    index=multi_idx
)

步骤2:计算与组起始值的差值

核心思路是:给每个分组的所有行匹配该组的起始值,再做减法,最后把每组第一个值的结果设为NaN(符合你的示例输出要求):

# 1. 为每个分组的每一行广播该组的起始值
group_start_values = df.groupby(level='group')['values'].transform('first')
# 2. 计算每行值与组起始值的差值
df['decay'] = df['values'] - group_start_values
# 3. 将每组第一个元素的差值设为NaN(起始值与自身的差值无意义)
df['decay'] = df['decay'].mask(df.groupby(level='group').cumcount() == 0)

最终输出结果

运行后你会得到完全符合预期的结果:

values  decay
group seq                  
A     1          120    NaN
      2          100  -20.0
      3           90  -30.0
      4           50  -70.0
B     1           11    NaN
      2           12   +1.0
      3           10   -1.0
      4            9   -2.0

代码细节解释

  • transform('first'):这个方法会把每个分组的第一个值,自动广播到该组的所有行,这样就能直接和每行的values做元素级减法,无需手动对齐索引。
  • cumcount() == 0:cumcount()会给每个分组的行从0开始计数,第一个行(计数为0)会被mask()替换成NaN,完美匹配你要的格式。

如果你的MultiIndex第一级没有命名,直接用level=0代替level='group'就可以,效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:27:29