Накопительная сумма, которая сбрасывается, когда условие больше не выполняется - PullRequest
0 голосов
/ 23 октября 2019

У меня есть фрейм данных со столбцом, который состоит из значений даты и времени, один из которых состоит из значений скорости, а другой состоит из значений timedelta между строками.

Я хотел бы получить кумулятивную сумму timedeltasвсякий раз, когда скорость ниже 2 узлов. Когда скорость поднимается выше 2 узлов, я хотел бы, чтобы эта накопленная сумма была сброшена до 0, а затем началось суммирование при следующем наблюдении скорости ниже 2 узлов.

Я начал с пометки всех наблюдений скоростизначения <2. Мне удается получить только совокупную сумму для всех наблюдений со скоростью <2, но не накопленную сумму, выделенную для каждого экземпляра. </p>

Фрейм данных выглядит следующим образом, а cum_sum - этожелаемый вывод:

datetime            speed      timedelta     cum_sum     flag
1-1-2019 19:30:00    0.5           0            0          1
1-1-2019 19:32:00    0.7           2            2          1
1-1-2019 19:34:00    0.1           2            4          1
1-1-2019 19:36:00    5.0           2            0          0
1-1-2019 19:38:00    25.0          2            0          0
1-1-2019 19:42:00    0.1           4            4          1
1-1-2019 19:49:00    0.1           7            11         1

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Вы можете использовать метод из «Как сгруппировать последовательные значения в pandas DataFrame» , чтобы получить группы, где flag - это либо 1, либо 0, и тогда вам просто нужнопримените cumsum к столбцу timedelta и установите те значения, где flag == 0 - 0:

gb = df.groupby((df['flag'] != df['flag'].shift()).cumsum())
df['cum_sum'] = gb['timedelta'].cumsum()
df.loc[df['flag'] == 0, 'cum_sum'] = 0
print(df)

даст

            datetime    speed   timedelta   flag   cum_sum
0   1-1-2019 19:30:00   0.5     0           1      0
1   1-1-2019 19:32:00   0.7     2           1      2
2   1-1-2019 19:34:00   0.1     2           1      4
3   1-1-2019 19:36:00   5.0     2           0      0
4   1-1-2019 19:38:00   25.0    2           0      0
5   1-1-2019 19:42:00   0.1     4           1      4
6   1-1-2019 19:49:00   0.1     7           1      11
0 голосов
/ 23 октября 2019

Примечание : используется глобальная переменная

c = 0
def fun(x):
    global c    
    if x['speed'] > 2.0:
        c = 0
    else:
        c = x['timedelta']+c
    return c

df = pd.DataFrame( {'datetime': ['1-1-2019 19:30:00']*7,
    'speed': [0.5,.7,0.1,5.0,25.0,0.1,0.1], 'timedelta': [0,2,2,2,2,4,7]})

df['cum_sum']=df.apply(fun, axis=1)
            datetime    speed   timedelta   cum_sum
0   1-1-2019 19:30:00   0.5     0           0
1   1-1-2019 19:30:00   0.7     2           2
2   1-1-2019 19:30:00   0.1     2           4
3   1-1-2019 19:30:00   5.0     2           0
4   1-1-2019 19:30:00   25.0    2           0
5   1-1-2019 19:30:00   0.1     4           4
6   1-1-2019 19:30:00   0.1     7           11
...