我试图以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
对此将提供任何帮助。
答案 0 :(得分:1)
我们需要将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