python - Pandas Groupby CumSum 仅在连续行上
问题描述
我试图在 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
withcumsum
创建子组键,然后我们做cumsum
and 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
推荐阅读
- angular - 尝试更改 textarea 的值时出现 DOMException
- oracle - 如何为一周的交货生成单个 AR 发票
- react-native - 如何在不重新捆绑资产的情况下重新编译本机应用程序
- android - 无法在 AndroidManifest.xml 中添加 Intent
- c# - 从 c# 消费时将参数传递给 asmx Web 服务
- sql-server - sql server中偏移量的替代
- scala - 如何替换 Scala 中的多个存在?
- ios - NSPredicate 中的单引号导致崩溃
- java - 为什么 SortBy Values 结果是错误的?
- java - OpenCV - 更好地读取浮雕字符的图像处理技术(例如信用卡、车牌号)