如何在多索引Pandas DataFrame中按年度、mapid及service计算cumsum()?
按年度对多索引DataFrame的指定分组计算累计求和(cumsum)
我来帮你搞定这个多索引DataFrame的年度累计求和问题!你的需求很明确:基于mapid和service这两个索引维度,在每个年度内计算cost的累计求和,对吧?咱们一步步来实现:
先理清楚数据结构
你的combined_df是按datetime(月度)、provider、mapid、service聚合后的多索引DataFrame,核心是要在同一年度内,对每个mapid+service+provider的组合,按时间顺序累计求和。
具体实现代码
这里有两种简洁的实现方式,你可以选自己顺手的:
方式1:新增年份列辅助分组
# 从datetime索引中提取年份,新增为临时列 combined_df['year'] = combined_df.index.get_level_values('datetime').year # 按年度、服务商、mapid、service分组,计算累计求和 combined_df['cumulative_cost'] = combined_df.groupby(['year', 'provider', 'mapid', 'service'])['cost'].cumsum() # 如果不需要保留year列,执行下面的代码删掉它 # combined_df.drop('year', axis=1, inplace=True)
方式2:直接用索引年份分组(无需新增列)
# 直接在groupby中使用索引的年份作为分组键 combined_df['cumulative_cost'] = combined_df.groupby( [ combined_df.index.get_level_values('datetime').year, 'provider', 'mapid', 'service' ] )['cost'].cumsum()
效果验证
拿你示例里的Amazon-10147.0-Monitor组合来说,计算后的累计值应该是:
- 2017-08-31:0.41
- 2017-09-30:0.41 + 0.89 = 1.30
- 2017-10-31:1.30 + 0.17 = 1.47
- 2017-11-30:1.47 + 0.35 = 1.82
完全符合你想要的年度内累计逻辑~
内容的提问来源于stack exchange,提问作者Karun
相关产品推荐
相关产品推荐

