我试图在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
如果有任何帮助,我将非常感激。
我们需要使用 shift
与 cumsum
创建子组密钥,然后我们做 cumsum
和 cumcount
. 注意这里我使用的是 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