Как найти дельту для того же номера и имени в пандах? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть приведенный ниже фрейм данных, и мне нужно вычесть и найти дельту между следующим кватером и текущим кватером, а также рядом со следующим кватером и текущим кватером.

Входные данные:

Number Name Year Quater value
1      an   2018 1      2.5
2      bn   2018 1      1.5
1      an   2018 2      3.5
2      bn   2018 2      4.5
1      an   2018 3      4.5
1      an   2018 4      2.5
2      bn   2018 4      1.5
1      an   2019 1      5.5
2      bn   2019 1      1.5

Вывод: d_1 - это разница между следующим кватером и текущим кватером для того же номера и имени, тогда как d_2 - это разница между следующим кватером и текущим кватером для того же номера и имени.

Number Name Year Quater value d_1 d_2
1      an   2018 1      2.5   1   2
2      bn   2018 1      1.5   3   
1      an   2018 2      3.5   1   -1
2      bn   2018 2      4.5       -3
1      an   2018 3      4.5   -2  1
1      an   2018 4      2.5   3
2      bn   2018 4      1.5   0
1      an   2019 1      5.5  
2      bn   2019 1      1.5

1 Ответ

0 голосов
/ 04 сентября 2018

Сначала убедитесь, что данные правильно отсортированы:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...