Python pandas cumsum () сбрасывается после достижения максимума

У меня есть pandas DataFrame с timedeltas как совокупная сумма этих дельт в отдельном столбце, выраженная в миллисекундах. Ниже приведен пример:

Transaction_ID  Time            TimeDelta       CumSum[ms]
1              00:00:04.500     00:00:00.000    000
2              00:00:04.600     00:00:00.100    100
3              00:00:04.762     00:00:00.162    262
4              00:00:05.543     00:00:00.781    1043
5              00:00:09.567     00:00:04.024    5067
6              00:00:10.654     00:00:01.087    6154
7              00:00:14.300     00:00:03.646    9800
8              00:00:14.532     00:00:00.232    10032
9              00:00:16.500     00:00:01.968    12000
10             00:00:17.543     00:00:01.043    13043

Я хотел бы иметь возможность предоставить максимальное значение для CumSum [мс], после которого накопительная сумма снова начнется с 0. Например, если максимальное значение было 3000 в приведенном выше примере, результаты будут выглядеть так:

Transaction_ID  Time            TimeDelta       CumSum[ms]
1              00:00:04.500     00:00:00.000    000
2              00:00:04.600     00:00:00.100    100
3              00:00:04.762     00:00:00.162    262
4              00:00:05.543     00:00:00.781    1043
5              00:00:09.567     00:00:04.024    0
6              00:00:10.654     00:00:01.087    1087
7              00:00:14.300     00:00:03.646    0
8              00:00:14.532     00:00:00.232    232
9              00:00:16.500     00:00:01.968    2200
10             00:00:17.543     00:00:01.043    0

Я исследовал использование оператора по модулю, но мне удалось сбросить его обратно до нуля только тогда, когда результирующее cumsum равно предоставленному пределу (т.е. cumsum [ms] 500% 500 равно нулю).

Заранее благодарим за любые мысли, которые у вас могут возникнуть, и сообщите мне, могу ли я предоставить дополнительную информацию.


person wrcobb    schedule 25.11.2014    source источник
comment
Один из способов - использовать expanding_apply - stackoverflow.com/a/26605026/3923281   -  person Alex Riley    schedule 25.11.2014


Ответы (1)


Вот пример того, как это можно сделать, перебирая каждую строку в фрейме данных. Для простоты я создал новые данные для примера:

df = pd.DataFrame({'TimeDelta': np.random.normal( 900, 60, size=100)})
print df.head()
    TimeDelta
0  971.021295
1  734.359861
2  867.000397
3  992.166539
4  853.281131

Итак, давайте сделаем цикл аккумулятора с желаемыми максимальными 3000:

maxvalue = 3000

lastvalue = 0
newcum = []
for row in df.iterrows():
    thisvalue =  row[1]['TimeDelta'] + lastvalue
    if thisvalue > maxvalue:
        thisvalue = 0
    newcum.append( thisvalue )
    lastvalue = thisvalue

Затем поместите список newcom в фрейм данных:

df['newcum'] = newcum
print df.head()
    TimeDelta       newcum
0  801.977678   801.977678
1  893.296429  1695.274107
2  935.303566  2630.577673
3  850.719497     0.000000
4  951.554206   951.554206
person JD Long    schedule 25.11.2014
comment
Это прекрасно работает. Похоже, я слишком усложнял ситуацию с cumsum(). Большое спасибо за участие. - person wrcobb; 25.11.2014
comment
Преимущество множества аккумуляторов, которые поддерживает Pandas, заключается в том, насколько они быстрые. Полагаю, итерация выполняется на языке C. Итерации по строкам в Pandas всегда намного медленнее. Но иногда это достаточно прагматичный поступок. - person JD Long; 25.11.2014
comment
Спасибо. если у меня другое условие ›сброс после нажатия макс + сброс при смене идентификатора ... что мне делать? - person rafine; 18.04.2021