Pandas Groupby CumSum только для последовательных строк - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь получить накопительную сумму и подсчитать внутри groupby в pandas, но только если, но только для последовательных значений строк. Если значение не является последовательным, я бы хотел накопить сумму и счет для сброса.

Группы расположены по «ID» и «STATUS», а «DAYS» - это суммируемые значения.

Мой текущий набор данных выглядит так:

ID  DAYS  STATUS
MXD  31    Est
MXD  11    Est
MXD  29    RDDS
MXD  31    Est
------------------
NOA  28    Est
NOA  34    RDDS
NOA  27    Est
NOA  27    Est
------------------
TNT  34    RDDS
TNT  27    RDDS
TNT  27    Est
TNT  27    RDDS

Мой желаемый набор данных будет выглядеть так:

ID  DAYS  STATUS  CONSECT_ONLY_SUM CONSECT_ONLY_COUNT
MXD  31    Est          31                 1
MXD  11    Est          42                 2
MXD  29    RDDS         29                 1  - accumulative sum and count reset on new non-consect row
MXD  31    Est          31                 1
-------------------
NOA  28    Est          28                 1
NOA  34    RDDS         34                 1
NOA  27    Est          27                 1  - accumulative sum and count starts on consect "STATUS" rows
NOA  27    Est          54                 2
-------------------
TNT  34    RDDS         34                 1
TNT  27    RDDS         61                 2
TNT  27    Est          27                 1 - accumulative sum and count reset on new non-consect row
TNT  27    RDDS         27                 1

Любая помощь по этому поводу будет принята с благодарностью.

1 Ответ

1 голос
/ 17 июня 2020

Нам нужно использовать shift с cumsum для создания ключа подгруппы, затем мы делаем cumsum и cumcount. Обратите внимание: здесь я использую pd.Serise groupby

g=df['DAYS'].groupby([df['ID'],df.STATUS.ne(df.STATUS.shift()).cumsum()])
df['SUMCOND']=g.cumsum()
df['COUNTCOND']=g.cumcount()+1
df
     ID  DAYS STATUS  SUMCOND  COUNTCOND
0   MXD    31    Est       31          1
1   MXD    11    Est       42          2
2   MXD    29   RDDS       29          1
3   MXD    31    Est       31          1
4   NOA    28    Est       28          1
5   NOA    34   RDDS       34          1
6   NOA    27    Est       27          1
7   NOA    27    Est       54          2
8   TNT    34   RDDS       34          1
9   TNT    27   RDDS       61          2
10  TNT    27    Est       27          1
11  TNT    27   RDDS       27          1
...