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

