【问题标题】:how to calculate the percentage of change based on previous years where the first year is 0如何计算第一年为0的前几年的变化百分比
【发布时间】:2023-01-02 10:12:17
【问题描述】:
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 转换,但没有得到任何结果。

【问题讨论】:

  • 2019 年 1 月与 2020 年相比需要 22/33,对吧?我觉得有错别字
  • 您能否提供与您正在做的事情相关的代码,这有助于弄清楚您要生产什么?

标签: pandas


【解决方案1】:

您可以每年轮班一次。为此,将年份增加 1 和 merge DataFrame 本身。然后计算百分比变化:

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

【讨论】:

    【解决方案2】:

    如果你稍微重塑你的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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-14
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多