基于另一列值生成新列:用向量化实现距上次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
相关产品推荐
相关产品推荐

