计算 Pandas 数据框中列值之间的百分比变化

A.N*_*.N. 4 python pandas

我有一个数据框,其中包含从 2017 年到 2021 年 5 年的一些价格指数。它看起来像这样:

国家 行业 指数
我们 农业 2017年 83
我们 农业 2018年 97.2
我们 农业 2019年 100
我们 农业 2020年 112
我们 农业 2021年 108
日本 矿业 2017年 88
日本 矿业 2018年 93
日本 矿业 2019年 100
日本 矿业 2020年 104
日本 矿业 2021年 112

我的基准年是 2019 年,因此标有 2019 年的每一行的索引都是 100。其他所有内容都会向上或向下移动。我想生成另一列,名为Percentage_Change显示从 2019 年作为基准年开始的同比变化。

然而,我尝试使用该pd.series.pct_change函数计算从 2017 年开始的同比百分比变化,并NaN为年份为 2017 年的所有行生成一个值,而不是 2019 年,而 2019 年应该是基准年。

我希望输出看起来像这样:

国家 行业 指数 变化百分比
日本 矿业 2017年 88 -5.37%
日本 矿业 2018年 93 -7%
日本 矿业 2019年 100 0
日本 矿业 2020年 104 4%
日本 矿业 2021年 112 7.69%

日本percentage_change2021 年至 2020 年之间的差异为 (112-104)/104 = 7.69%,2020 年与 2019 年之间的差异为 (104-100)/100 = 4%,2018 年与 2019 年之间的差异为 (93-100)/ 100 = -7%,2017年与2018年的差异为(88-93)/93 = -5.37%

还有其他方法可以计算熊猫的变化百分比吗?

moz*_*way 6

pct_change正在计算相对于先前值的变化(这就是 2017 为 NaN 的原因),这似乎不是您想要的。如果您想计算相对于 2019 年的百分比变化,因为 2019 年已经标准化为 100,只需减去 100:

df['Percentage_Change'] = df['Index'].sub(100)
Run Code Online (Sandbox Code Playgroud)

输出:

  Country     Industry  Year  Index  Percentage_Change
0      US  Agriculture  2017   83.0              -17.0
1      US  Agriculture  2018   97.2               -2.8
2      US  Agriculture  2019  100.0                0.0
3      US  Agriculture  2020  112.0               12.0
4      US  Agriculture  2021  108.0                8.0
5   Japan       Mining  2017   88.0              -12.0
6   Japan       Mining  2018   93.0               -7.0
7   Japan       Mining  2019  100.0                0.0
8   Japan       Mining  2020  104.0                4.0
9   Japan       Mining  2021  112.0               12.0
Run Code Online (Sandbox Code Playgroud)

双向pct_change

如果你想要一个pct_change以 100 为中心的双向“中心”,你可以使用掩码来计算pct_change双向:

df['Percentage_Change'] = (df
 .assign(ref=df['Year'].eq(2019))
 .groupby(['Country', 'Industry'], group_keys=False)
 .apply(lambda g: g['Index'].where(g['ref'].cummax()).pct_change()
                  .fillna(g['Index'][::-1].pct_change().mask(g['ref'].cummax(), 0))
       )
)
Run Code Online (Sandbox Code Playgroud)

输出:

  Country     Industry  Year  Index  Percentage_Change
0      US  Agriculture  2017   83.0          -0.146091
1      US  Agriculture  2018   97.2          -0.028000
2      US  Agriculture  2019  100.0           0.000000
3      US  Agriculture  2020  112.0           0.120000
4      US  Agriculture  2021  108.0          -0.035714
5   Japan       Mining  2017   88.0          -0.053763
6   Japan       Mining  2018   93.0          -0.070000
7   Japan       Mining  2019  100.0           0.000000
8   Japan       Mining  2020  104.0           0.040000
9   Japan       Mining  2021  112.0           0.076923
Run Code Online (Sandbox Code Playgroud)