Pandas如何无需遍历实现TimeDelta超阈值后逐段标记后续行
实现方案
可以用cumsum()实现,全程为pandas向量化操作,无逐行遍历,执行效率极高。
实现逻辑
你要的标签逻辑本质是统计截止到当前行,历史上TimeDelta超过阈值的总次数,再加上初始值1,刚好和cumsum()的累加特性完全匹配。
完整代码
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'time': [1, 2, 4, 7, 8], 'parameter': [123, 456, 122, 344, 344], 'TimeDelta': ['-', 1, 2, 3, 1] }) # 1. 预处理TimeDelta列,把非数值的'-'转为0(小于阈值即可) df['TimeDelta'] = pd.to_numeric(df['TimeDelta'], errors='coerce').fillna(0) # 2. 设置阈值计算标签 threshold = 1.5 df['Label'] = (df['TimeDelta'] > threshold).cumsum() + 1
结果验证
运行后得到的Label列和你给出的预期结果完全一致:
| time | parameter | TimeDelta | Label |
|---|---|---|---|
| 1 | 123 | 0 | 1 |
| 2 | 456 | 1 | 1 |
| 4 | 122 | 2 | 2 |
| 7 | 344 | 3 | 3 |
| 8 | 344 | 1 | 3 |
注意事项
如果你的场景中第一行的TimeDelta也可能大于阈值,且要求第一行标签固定为1,可以调整掩码的第一个值为False:
mask = df['TimeDelta'] > threshold mask.iloc[0] = False df['Label'] = mask.cumsum() + 1
内容的提问来源于stack exchange,提问作者Adler Müller
相关产品推荐
相关产品推荐

