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

Pandas如何计算首年记为0的分月度年度同比变化百分比

Pandas 同月份匹配同比百分比计算方案

初始测试数据

import pandas as pd

df = pd.DataFrame({
    'year':[2019,2019,2019,2019,2020,2020,2020,2020,2021,2021,2021,2021],
    'month':[1,2,3,4,1,2,3,4,1,2,3,4],
    'values':[33,63,24,19,22,30,60,25,23,24,30,80]
})

实现逻辑

之前用groupby配合transform没得到正确结果,基本是因为没有提前排序导致取值错位,按以下逻辑处理即可:

  • 先按month、year字段升序排序,保证同一月份下数据按年份从小到大排列
  • 按month分组,通过shift(1)取同组内上一条记录,也就是上一年同月份的数值
  • 按照公式(当期值 - 上年同期值) / 上年同期值 * 100计算同比变化百分比
  • 首个统计年份(2019年)没有上一年参照数据,计算结果为空,直接填充为0即可

完整实现代码

# 排序保证同月份下年份顺序正确
df = df.sort_values(by=['month', 'year']).reset_index(drop=True)

# 提取同月份上一年数值
df['last_year_val'] = df.groupby('month')['values'].shift(1)

# 计算同比百分比,首年空值填0,结果保留2位小数
df['yoy_pct'] = ((df['values'] - df['last_year_val']) / df['last_year_val'] * 100).fillna(0).round(2)

# 可选:删除中间辅助列
df = df.drop(columns=['last_year_val'])

# 可选:排序回原有的年-月展示顺序
df = df.sort_values(by=['year', 'month']).reset_index(drop=True)

结果校验

计算结果完全符合需求:

  • 2019年所有月份的yoy_pct均为0
  • 2020年1月同比为-33.33%,和示例给出的参考值一致
  • 其余月份均按相同月份跨年匹配计算,例如2021年4月同比为220%

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:21:43