如何将大熊猫中的两个连续行划分为一组

时间:2019-09-11 09:49:49

标签: python pandas divide

我有以下数据框

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函数

你能帮我吗?谢谢

2 个答案:

答案 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