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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:30:55