pandas 如何计算基于第一年为0的以前年份的变化百分比

k97glaaz  于 2023-01-07  发布在  其他
关注(0)|答案(2)|浏览(121)
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]})

如何计算每年/每月的变化百分比。例如,如果我比较2019年和2020年的第1个月,则结果为:
22/33 = -33%
第一年(2019年)的预期结果应为0,以后各年的预期结果应为增加/减少百分比。

我尝试过groupby变换,但没有得到任何结果。

fslejnso

fslejnso1#

您可以每年使用一次偏移。为此,将年份增加1,并将DataFrame与其本身相加merge。然后计算百分比变化:

cols = ['year', 'month']
vals = df[cols].merge(df.assign(year=df['year']+1), on=cols, how='left')['values']

df['change'] = df['values'].sub(vals).div(vals).mul(100).fillna(0)

输出:

year  month  values      change
0   2019      1      33    0.000000
1   2019      2      63    0.000000
2   2019      3      24    0.000000
3   2019      4      19    0.000000
4   2020      1      22  -33.333333
5   2020      2      30  -52.380952
6   2020      3      60  150.000000
7   2020      4      25   31.578947
8   2021      1      23    4.545455
9   2021      2      24  -20.000000
10  2021      3      30  -50.000000
11  2021      4      80  220.000000
mo49yndu

mo49yndu2#

如果稍微修改一下df,可以使用pd.pct_change()

df = df.set_index(['year', 'month']).unstack(level=0)
print(df)

      values          
year    2019 2020 2021
month                 
1         33   22   23
2         63   30   24
3         24   60   30
4         19   25   80

res = df.pct_change(axis='columns').mul(100).fillna(0)
print(res)

      values                        
year    2019        2020        2021
month                               
1        0.0  -33.333333    4.545455
2        0.0  -52.380952  -20.000000
3        0.0  150.000000  -50.000000
4        0.0   31.578947  220.000000

相关问题