Получить сумму значений из последней n-й строки по идентификатору группы - PullRequest
0 голосов
/ 30 октября 2018

Я просто хочу знать, как получить сумму последних 5-х значений на основе идентификатора из каждой строки.

ДФ:

id       values
-----------------
a        5
a        10
a        10
b        2
c        2
d        2
a        5
a        10
a        20
a        10
a        15
a        20

ожидаемый df:

id       values       sum(x.tail(5))
-------------------------------------
a        5            NaN
a        10           NaN
a        10           NaN
b        2            NaN
c        2            NaN
d        2            NaN
a        5            NaN
a        10           NaN
a        20           40
a        10           55
a        15           55
a        20           60

Для простоты я пытаюсь найти сумму значений из последних 5-х строк в каждой строке с идентификатором a только.

Я пытался использовать код df.apply(lambda x: x.tail(5)), но он показывал мне только последние 5 строк из самой последней строки всего df. Я хочу получить сумму последних n-ых строк из каждой строки. По сути это похоже на roll_sum для данных временных рядов.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Попробуйте использовать groupby, transform и rolling:

df['sum(x.tail(5))'] = df.groupby('id')['values']\
                         .transform(lambda x: x.rolling(5, min_periods=5).sum().shift())

Выход:

   id values  sum(x.tail(5))
1   a      5             NaN
2   a     10             NaN
3   a     10             NaN
4   b      2             NaN
5   c      2             NaN
6   d      2             NaN
7   a      5             NaN
8   a     10             NaN
9   a     20            40.0
10  a     10            55.0
11  a     15            55.0
12  a     20            60.0
0 голосов
/ 30 октября 2018

Вы можете рассчитать сумму последних 5 следующим образом:

df["rolling As"] = df[df['id'] == 'a'].rolling(window=5).sum()["values"]

(включая текущую строку как одну из 5. не уверен, что это именно то, что вам нужно)

id  values  rolling As
0   a   5   NaN
1   a   10  NaN
2   a   10  NaN
3   b   2   NaN
4   c   2   NaN
5   d   5   NaN
6   a   10  NaN
7   a   20  55.0
8   a   10  60.0
9   a   10  60.0
10  a   15  65.0
11  a   20  75.0

Если вы не хотите, чтобы оно было включено. вы можете сдвинуть

df["rolling"] = df[df['id'] == 'a'].rolling(window=5).sum()["values"].shift()

дать:

id  values  rolling
0   a   5   NaN
1   a   10  NaN
2   a   10  NaN
3   b   2   NaN
4   c   2   NaN
5   d   5   NaN
6   a   10  NaN
7   a   20  NaN
8   a   10  55.0
9   a   10  60.0
10  a   15  60.0
11  a   20  65.0
...