Pandas中如何根据TimeDelta规则无需循环实现周期性标签标注
解决方案
实现逻辑
完全基于Pandas向量化操作实现,无任何循环,性能适配大规模时间序列场景:
- 划分重置块:通过
cumsum标记所有TimeDelta≥6的位置,每遇到一个符合条件的行,块编号+1,同一块内的标签计数共享上下文 - 生成递增掩码:仅当
1<TimeDelta<6时标签需要+1,其余情况保持上一步的标签值 - 循环计数逻辑:按块分组计算累计增量,对累计结果取模3后+1,自动实现1-3的循环计数,无需额外判断封顶规则
完整代码
import pandas as pd data = [[1, 1, 0], [2, 1, 1], [4, 1, 2], [5, 1, 1], [7, 1, 2], [8, 1, 1], [14, 1, 6], [15, 1, 1], [17, 1, 2], ] df = pd.DataFrame(data, columns = ['time', 'parameter_1', 'TimeDelta']) # 划分重置块 blocks = df['TimeDelta'].ge(6).cumsum() # 生成需要递增的掩码 incr_mask = df['TimeDelta'].between(1, 6, inclusive='neither') # 分组计算累计增量后取模实现1-3循环 df['label'] = incr_mask.groupby(blocks).cumsum().mod(3).add(1) print(df)
输出结果
| 索引 | time | parameter_1 | TimeDelta | label |
|---|---|---|---|---|
| 0 | 1 | 1 | 0 | 1 |
| 1 | 2 | 1 | 1 | 1 |
| 2 | 4 | 1 | 2 | 2 |
| 3 | 5 | 1 | 1 | 2 |
| 4 | 7 | 1 | 2 | 3 |
| 5 | 8 | 1 | 1 | 3 |
| 6 | 14 | 1 | 6 | 1 |
| 7 | 15 | 1 | 1 | 1 |
| 8 | 17 | 1 | 2 | 2 |
内容的提问来源于stack exchange,提问作者Adler Müller
相关产品推荐
相关产品推荐

