我有一个数据框,其中包含从 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%
还有其他方法可以计算熊猫的变化百分比吗?
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)
| 归档时间: |
|
| 查看次数: |
4029 次 |
| 最近记录: |