如何用Pandas按分组列逐月计算累计值?
按月份展示全局累计值的解决方案
问题背景
给定如下数据集,需要按月份展示所有AA前缀ID的累计值,期望结果是每月的累计总和(而非单个ID的组内累计):
数据集
from io import StringIO import pandas as pd df = pd.read_csv(StringIO(""" ID val Date AA:1 1 4/1/2022 AA:1 2 4/3/2022 AA:2 3 5/1/2022 AA:3 5 6/5/2022 AA:4 5 1/1/2023"""), sep='\s+')
期望结果
ID val Date AA 3 4/1/2022 AA 6 5/1/2022 AA 11 6/1/2022 AA 16 1/1/2023
当前代码问题
当前尝试的代码是按单个具体ID(如AA:1)+ 月份分组计算组内累计,这和需求的「全局所有AA类ID的月度累计」不符:
# 转换日期格式 df['Date'] = pd.to_datetime(df['Date']) # 按ID和月份分组,计算累计和 df['Cumulative_Value'] = df.groupby([df['ID'], df['Date'].dt.to_period('M')])['val'].cumsum()
正确解决方案
需要先统一ID前缀,再按月份汇总当月总和,最后计算全局累计:
from io import StringIO import pandas as pd df = pd.read_csv(StringIO(""" ID val Date AA:1 1 4/1/2022 AA:1 2 4/3/2022 AA:2 3 5/1/2022 AA:3 5 6/5/2022 AA:4 5 1/1/2023"""), sep='\s+') # 1. 提取ID的统一前缀(去掉冒号后的部分) df['ID'] = df['ID'].str.split(':').str[0] # 2. 转换日期并统一为当月第一天,匹配期望格式 df['Date'] = pd.to_datetime(df['Date']).dt.to_period('M').dt.start_time # 3. 按ID和月份分组,计算当月val总和 monthly_sum = df.groupby(['ID', 'Date'])['val'].sum().reset_index() # 4. 计算全局累计值 monthly_sum['val'] = monthly_sum['val'].cumsum() # 输出结果 print(monthly_sum)
代码说明
- 步骤1:将
AA:1、AA:2等ID统一为AA,确保所有同前缀的记录合并计算 - 步骤2:把日期转换为当月第一天,和期望结果的日期格式对齐
- 步骤3:按月份汇总当月所有val的总和(比如4月的1+2=3)
- 步骤4:对月度总和做累计计算(3→3+3=6→6+5=11→11+5=16)
运行后将得到与期望一致的输出:
ID Date val 0 AA 2022-04-01 3 1 AA 2022-05-01 6 2 AA 2022-06-01 11 3 AA 2023-01-01 16
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

