You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取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)

逻辑说明

  1. 原代码生成的DT_Count是连续零的累计计数;
  2. 通过groups = df['Amperaje'].ne(0).cumsum()将连续的零和后续的非零元素划分为同一组;
  3. 用transform('max')获取每组内累计计数的最大值(即该段连续零的总个数);
  4. 最后通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:17:02