在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
相关产品推荐
相关产品推荐

