首页 > 解决方案 > 在 Pandas 中根据 TimeDelta 进行标记

问题描述

我有一个具有以下结构的熊猫数据框:

时间 参数_1 时间增量
1 1 -
2 1 1
4 1 2
5 1 1
7 1 2
8 1 1
14 1 6
15 1 1
17 1 2

现在我想根据时间标记。标签从 1 开始。如果时间增量仅为 1,则标签不应增加。如果 timedelta 大于 1 但小于 6,则标签应从 1 开始,然后计数到 3。如果距离为 6 或更大,则在 1 处再次进行标记。这里也是,标签再次达到3.等等。是否有可能没有循环或者我怎样才能最好地做到这一点?如果您看到如下表格,也许会更容易理解:

时间 参数_1 时间增量 标签
1 42 - 1
2 1 1 1
4 1 2 2
5 1 1 2
7 1 2 3
8 1 1 3
14 1 6 1
15 1 1 1
17 1 2 2

我已经问过一个类似的问题,请参阅:一旦值大于 xy,标记所有后续行 但是,这里没有重复标记,或者如果距离大于 xy,它不会从 1 重新开始。有任何想法吗?谢谢。

事实上我有时间序列数据。在 6 秒后重复: 在此处输入图像描述

Edit2:当我使用 Quang Hoang 的代码时,标签如下所示:

在此处输入图像描述

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()
labels = df['TimeDelta'].gt(1.5)
df['label'] = labels.groupby(blocks).cumsum()


df

标签: pythonpandasdataframe

解决方案


该方法应该非常相似:您首先识别标签块,然后识别块内的标签:

blocks = df['TimeDelta'].ge(6).cumsum()
labels = df['TimeDelta'].gt(1)
df['label'] = labels.groupby(blocks).cumsum()

推荐阅读