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

基于另一列值生成新列:用向量化实现距上次0的天数统计

向量化实现距离最近一次0的天数统计

首先看原始数据:

import pandas as pd
import numpy as np

values = [0, 22, 30, 0, 20, 22, 11, 0, 13]
index = pd.date_range(start='2023-10-1', periods=len(values))

df = pd.DataFrame({'values': values}, index=index)

目标是生成新列days,统计每行距离最近一次values为0的天数。

向量化解决方案

可以通过以下步骤实现,完全避免循环,效率更高:

# 标记0出现的位置
df['is_zero'] = df['values'] == 0

# 生成每个分组的起始索引(每次0出现时重置分组)
df['group'] = df['is_zero'].cumsum()

# 对每个分组内的行进行计数,从0开始
df['days'] = df.groupby('group').cumcount()

# 可选:删除中间辅助列
df.drop(['is_zero', 'group'], axis=1, inplace=True)

运行后得到的结果和循环方法一致:

values  days
2023-10-01      0     0
2023-10-02     22     1
2023-10-03     30     2
2023-10-04      0     0
2023-10-05     20     1
2023-10-06     22     2
2023-10-07     11     3
2023-10-08      0     0
2023-10-09     13     1

原理说明

  • 标记0的位置:is_zero列用布尔值标记哪些行的values是0。
  • 生成分组:cumsum()会在每次遇到True(即0出现)时累加,这样每两个0之间的行就会被分到同一个组里,每个0所在的行是新组的起点。
  • 组内计数:groupby('group').cumcount()会在每个分组内从0开始计数,正好对应距离最近一次0的天数——0所在的行计数为0,之后每行依次加1,直到下一个0出现时重置为0。

这种方法利用pandas的内置向量化操作,比循环效率高得多,尤其是在处理大规模数据时优势明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:00:13