Сначала убедитесь, что данные правильно отсортированы:
df = df.sort_values(by=['Year', 'Quater'])
Затем используйте groupby
и diff
для вычисления различий между строками:
df['d_1'] = df.groupby(['Number', 'Name'])['value'].diff(periods=-1) * -1
df['d_2'] = df.groupby(['Number', 'Name'])['value'].diff(periods=-2) * -1
df = df.fillna(0.0)
Результат:
Number Name Year Quater value d_1 d_2
1 an 2018 1 2.5 1.0 2.0
2 bn 2018 1 1.5 3.0 -0.0
1 an 2018 2 3.5 1.0 -1.0
2 bn 2018 2 4.5 -3.0 -3.0
1 an 2018 3 4.5 -2.0 1.0
1 an 2018 4 2.5 3.0 0.0
2 bn 2018 4 1.5 -0.0 0.0
1 an 2019 1 5.5 0.0 0.0
2 bn 2019 1 1.5 0.0 0.0
Edit:
Если необходимо учитывать и пропущенные значения, лучше всего сначала resample
в кадре данных добавить недостающие строки.
Сначала добавьте новый столбец date
и повторите выборку для кадра данных:
df['date'] = pd.to_datetime(df['Year'].astype(str) + 'Q' + df['Quater'].astype(str))
df = df.set_index('date').groupby(['Number', 'Name']).resample('Q').first().drop(['Name', 'Number'], axis=1).reset_index()
Теперь у нас есть:
Number Name date Year Quater value
1 an 2018-03-31 2018 1.0 2.5
1 an 2018-06-30 2018 2.0 3.5
1 an 2018-09-30 2018 3.0 4.5
1 an 2018-12-31 2018 4.0 2.5
1 an 2019-03-31 2019 1.0 5.5
2 bn 2018-03-31 2018 1.0 1.5
2 bn 2018-06-30 2018 2.0 4.5
2 bn 2018-09-30 NaN NaN NaN
2 bn 2018-12-31 2018 4.0 1.5
2 bn 2019-03-31 2019 1.0 1.5
Теперь примените те же groupby
и diff
, что и выше, а также отбросив дополнительные строки, столбец date
и отсортируйте результат:
df['d_1'] = df.groupby(['Number', 'Name'])['value'].diff(periods=-1) * -1
df['d_2'] = df.groupby(['Number', 'Name'])['value'].diff(periods=-2) * -1
df.dropna(subset=['Year']).fillna(0.0).sort_values(by=['Year', 'Quater']).drop('date', axis=1)
fillna
можно пропустить, если вы предпочитаете сохранять NaN.