我有以下数据框
d = {'id': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5,], 'value': [21, 44, 51, 10, 30, 7, 15, 51, 24, 122, 36, 41, 15, 12, 35, ], 'year': [2007, 2007, 2007, 2007, 2007, 2009, 2009, 2009, 2009, 2009, 2008, 2008, 2008, 2008, 2008]}
df = pd.DataFrame(d, columns = ['id','value','year'])
我想按ID和Year分组。然后,我想获取每年的价值之间的差异百分比。
我可以通过
得到每年之间的差额df["difprev"]= df.sort_values(by=['id','year']).groupby(['id']).value.diff()
但是我不知道如何将每个差异“ difprev”除以上一个,以获取每年的(de)增长百分比,因为我找不到类似于diff()的groupby函数
你能帮我吗?谢谢
答案 0 :(得分:1)
df = df.sort_values(by=['id','year'])
df['percdif']=df.difprev / df.value.shift() * 100
结果:
id value year difprev percdif
0 1 21 2007 NaN NaN
10 1 36 2008 15.0 71.428571
5 1 7 2009 -29.0 -80.555556
1 2 44 2007 NaN NaN
11 2 41 2008 -3.0 -6.818182
6 2 15 2009 -26.0 -63.414634
2 3 51 2007 NaN NaN
12 3 15 2008 -36.0 -70.588235
7 3 51 2009 36.0 240.000000
3 4 10 2007 NaN NaN
13 4 12 2008 2.0 20.000000
8 4 24 2009 12.0 100.000000
4 5 30 2007 NaN NaN
14 5 35 2008 5.0 16.666667
9 5 122 2009 87.0 248.571429
答案 1 :(得分:1)
请参见https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.rolling.html
grouped = df.sort_values(by=['id','year']).groupby(['id'])
grouped.value.rolling(2).apply(lambda x: (x[1]-x[0])/x[0])
输出:
id
1 0 NaN
10 0.714286
5 -0.805556
2 1 NaN
11 -0.068182
6 -0.634146
3 2 NaN
12 -0.705882
7 2.400000
4 3 NaN
13 0.200000
8 1.000000
5 4 NaN
14 0.166667
9 2.485714
Name: value, dtype: float64