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

在Pandas DataFrame列中用递增数值填充1间间隙,遇1重置

问题需求

需要将DataFrame列中的0替换为逐次递增的数值,规则是从遇到的1开始,后续的0依次填充为2、3...直到下一个1出现时重置。数据集规模超100万行,要求采用矢量化操作保证性能。

输入示例代码:

import pandas as pd
df = pd.DataFrame({'col': [1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0]})

输入列的原始数据:

0     1
1     0
2     1
3     0
4     1
5     1
6     0
7     0
8     0
9     0
10    1
11    0
12    1
13    1
14    0

目标结果:

0     1
1     2
2     1
3     2
4     1
5     1
6     2
7     3
8     4
9     5
10    1
11    2
12    1
13    1
14    2

此前尝试ffill()和cumsum()无法满足需求:cumsum()无法在遇到新的1时重置递增计数。


矢量化解决方案

采用分组累加的方式,全程依赖pandas底层优化的矢量化操作,适合处理百万级规模数据:

import pandas as pd

df = pd.DataFrame({'col': [1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0]})

# 1. 生成分组标识:每遇到一个1,分组ID自动递增,将"1+后续0"的连续段划分为同一组
df['group'] = df['col'].cumsum()

# 2. 组内计算递增数值:组内每行的序号从0开始计数,加1后刚好匹配需求的1、2、3...
df['result'] = df.groupby('group').cumcount() + 1

# 可选:删除中间生成的分组列
df = df.drop('group', axis=1)

print(df['result'])

逻辑说明

  • df['col'].cumsum():利用原列中的1作为分组触发点,累加后每个连续的目标段会被分配同一个分组ID,遇到新的1时分组ID自动更新,实现计数重置的效果。
  • groupby('group').cumcount():对每个分组内的行从0开始顺序计数,加1后正好对应需求:分组第一个元素(原1)保留为1,后续的0依次替换为2、3...

内容的提问来源于stack exchange,提问作者nborel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:09:25