如何提取DataFrame中非零值前的最大连续零计数(其余置0)
问题解决:保留连续零段的最大计数值,其余置0
需求说明
DataFrame的Amperaje列包含正整数、负整数和零,需要统计非零值前的连续零个数,但仅保留每个连续零段的最大计数值(即该段零的总个数),其余位置置0。
示例
Amperaje列输入:[0,0,-53,-25,6,0,0,0,5]- 当前代码生成的
DT_Count:[1,2,0,0,0,1,2,3,0] - 期望
DT_Count结果:[0,0,2,0,0,0,0,0,3](对应两段连续零的长度2和3,仅在后续第一个非零值位置保留,其余为0)
现有代码
a = df['Amperaje'].shift().eq(0) b = a.cumsum() df['DT_Count'] = b.sub(b.mask(a).ffill().fillna(0)) print(df)
解决方案
基于现有代码,新增分组统计最大值的逻辑,仅保留每个连续零段的最大计数值:
# 原累计计数逻辑 a = df['Amperaje'].shift().eq(0) b = a.cumsum() df['DT_Count'] = b.sub(b.mask(a).ffill().fillna(0)) # 按连续非零/零分组,标记每个元素所属组 groups = df['Amperaje'].ne(0).cumsum() # 获取每个组内DT_Count的最大值 max_counts = df.groupby(groups)['DT_Count'].transform('max') # 仅保留等于最大值的元素,其余置0 df['DT_Count'] = df['DT_Count'].where(df['DT_Count'] == max_counts, 0)
逻辑说明
- 原代码生成的
DT_Count是连续零的累计计数; - 通过
groups = df['Amperaje'].ne(0).cumsum()将连续的零和后续的非零元素划分为同一组; - 用
transform('max')获取每组内累计计数的最大值(即该段连续零的总个数); - 最后通过
where方法仅保留等于最大值的元素,其余位置置0。
简化方案(直接计算非零值前的连续零个数)
如果不需要保留原累计计数逻辑,可直接计算每个非零值前的连续零个数,其余位置置0:
# 标记连续零的分组 zero_groups = df['Amperaje'].eq(0).cumsum() # 计算每个零组的长度,映射到后续第一个非零值位置 df['DT_Count'] = df['Amperaje'].ne(0).map(df.groupby(zero_groups)['Amperaje'].count()) # 零值位置填充为0 df['DT_Count'] = df['DT_Count'].fillna(0).astype(int)
内容的提问来源于stack exchange,提问作者Luis Becerril
相关产品推荐
相关产品推荐

