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

