如何在这个简单的数据框架上计算百分数变化?

时间:2019-08-09 15:16:26

标签: python pandas

我有如下数据:

+------+---------+------+-------+
| Year | Cluster | AREA | COUNT |
+------+---------+------+-------+
| 2016 |       0 |   10 |  2952 |
| 2016 |       1 |   10 |  2556 |
| 2016 |       2 |   10 |  8867 |
| 2016 |       3 |   10 |  9786 |
| 2017 |       0 |   10 |  2470 |
| 2017 |       1 |   10 |  3729 |
| 2017 |       2 |   10 |  8825 |
| 2017 |       3 |   10 |  9114 |
| 2018 |       0 |   10 |  1313 |
| 2018 |       1 |   10 |  3564 |
| 2018 |       2 |   10 |  7245 |
| 2018 |       3 |   10 |  6990 |
+------+---------+------+-------+

例如,我必须获得每个集群与上一年相比的百分比变化。

+------+---------+-----------+-------+----------------+
| Year | Cluster | AREA      | COUNT | Percent Change |
+------+---------+-----------+-------+----------------+
| 2016 |       0 |        10 |  2952 | NaN            |
| 2017 |       0 |        10 |  2470 | -16.33%        |
| 2018 |       0 |        10 |  1313 | -46.84%        |
| 2016 |       1 |        10 |  2556 | NaN            |
| 2017 |       1 |        10 |  3729 | 45.89%         |
| 2018 |       1 |        10 |  3564 | -4.42%         |
| 2016 |       2 |        10 |  8867 | NaN            |
| 2017 |       2 |        10 |  8825 | -0.47%         |
| 2018 |       2 |        10 |  7245 | -17.90%        |
| 2016 |       3 |        10 |  9786 | NaN            |
| 2017 |       3 |        10 |  9114 | -6.87%         |
| 2018 |       3 |        10 |  6990 | -23.30%        |
+------+---------+-----------+-------+----------------+

有什么容易做到的吗? 我在下面尝试了一些方法,这似乎是最合理的方法,但是它为每个pct_change返回NaN。

df['pct_change'] = df.groupby(['Cluster','Year'])['COUNT '].pct_change()


+------+---------+------+------------+------------+
| Year | Cluster | AREA |   Count    | pct_change |
+------+---------+------+------------+------------+
| 2016 |       0 |   10 | 295200.00% | NaN        |
| 2016 |       1 |   10 | 255600.00% | NaN        |
| 2016 |       2 |   10 | 886700.00% | NaN        |
| 2016 |       3 |   10 | 978600.00% | NaN        |
| 2017 |       0 |   10 | 247000.00% | NaN        |
| 2017 |       1 |   10 | 372900.00% | NaN        |
| 2017 |       2 |   10 | 882500.00% | NaN        |
| 2017 |       3 |   10 | 911400.00% | NaN        |
| 2018 |       0 |   10 | 131300.00% | NaN        |
| 2018 |       1 |   10 | 356400.00% | NaN        |
| 2018 |       2 |   10 | 724500.00% | NaN        |
| 2018 |       3 |   10 | 699000.00% | NaN        |
+------+---------+------+------------+------------+

基本上,我只是希望函数比较每个集群的同比变化。

2 个答案:

答案 0 :(得分:0)

df['pct_change'] = df.groupby(['Cluster'])['Count'].pct_change()
df.sort_values('Cluster', axis = 0, ascending = True)

答案 1 :(得分:0)

另一种通过转换变老的方法

df['p'] = df.groupby('cluster')['count'].transform(lambda x: (x-x.shift())/x.shift())
df = df.sort_values(by='cluster')

print(df)

    year  cluster  area  count         p
0   2016        0    10   2952       NaN
4   2017        0    10   2470 -0.163279
8   2018        0    10   1313 -0.468421
1   2016        1    10   2556       NaN
5   2017        1    10   3729  0.458920
9   2018        1    10   3564 -0.044248
2   2016        2    10   8867       NaN
6   2017        2    10   8825 -0.004737
10  2018        2    10   7245 -0.179037
3   2016        3    10   9786       NaN
7   2017        3    10   9114 -0.068670
11  2018        3    10   6990 -0.233048