熊猫群比连续行数的累加和。

问题描述 投票:-1回答:1

我试图在pandas中的groupby中得到一个累积的总和和计数,但只有在连续的行值上才可以。 如果值不是连续的,我想把累计和和计数重置。

组是由 "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

如果有任何帮助,我将非常感激。

python pandas pandas-groupby cumsum
1个回答
1
投票

我们需要使用 shiftcumsum 创建子组密钥,然后我们做 cumsumcumcount. 注意这里我使用的是 pd.Serise group by

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
© www.soinside.com 2019 - 2024. All rights reserved.