2014-11-25 2 views
3

밀리 초 단위로 표시되는 별도의 열에 해당 델타의 누적 합계로 timedeltas가있는 pandas DataFrame이 있습니다. 예가 아래에 제공된다 : I 누적 합계는, 예를 들어 0에서 다시 시작 것이다 후 CumSum [MS]의 최대 값을 제공 할 수 있도록하고자 Python pandas cumsum() 최대 재설정 후 재설정

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 

, 최대 값이 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가 제공하는 제한 같을 때 다시 0으로 재설정 만 성공입니다 한 예 cumsum [ ms]가 500 % 500과 같음).

어떤 생각이든 미리 감사 드리며 더 자세한 정보를 제공해 줄 수 있으면 알려 주시기 바랍니다.

+2

편도는'expanding_apply'을 사용할 수 있습니다 - http://stackoverflow.com/a/26605026/3923281 –

답변

4

다음은 데이터 프레임의 각 행을 반복적으로 처리하는 방법의 예입니다.

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 
:

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 

는 그 다음 dataframe에 newcom 목록을 넣어 :

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 최대로 어큐뮬레이터 루프를하자 : 나는 단순함을 위해, 예를 들어 새로운 데이터를 생성

+0

이것은 완벽하게 작동합니다. 내가'cumsum()'으로 너무 복잡한 것처럼 보입니다. 매우 감사합니다. – wrcobb

+1

팬더가 지원하는 numpy 축약기의 장점은 매우 빠릅니다. 반복은 C로 수행됩니다. 팬더의 행 반복은 항상 훨씬 느립니다. 그러나 때때로 그것은 합리적으로 실용적인 일입니다. –