2016-09-23 6 views
4


아주 이해하기 쉬운 간단한 예입니다.다른 열에서 롤링 함수의 결과에 따라 pandas DataFrame 열의 값을 계산하는 방법

목표는 다른 열에서 롤링 기능의 결과에 따라 팬더 DataFrame 열의 값을 계산하는 것입니다.

나는 다음과 같은 DataFrame 있습니다

import numpy as np 
import pandas as pd 

s = pd.Series([1,2,3,2,1,2,3,2,1])  
df = pd.DataFrame({'DATA':s, 'POINTS':0}) 

df 

DataFrame start

참고 : 나는 심지어 유래 편집 창에서 Jupyter 노트북 결과를 포맷하는 방법을 모른다, 그래서 복사 및 붙여 넣기 이미지, 뭐라 구요.

데이터 열은 관찰 된 데이터를 보여줍니다. POINTS 열은 0으로 초기화되며 다음에서 설명하는 것처럼 DATA 열에 적용되는 "롤링"기능의 출력을 수집하는 데 사용됩니다.

윈도우 = 단지 예

nwin = 4 

4 은 "롤링"함수는 최대를 산출 설정한다.

이제 내가 필요한 것을 설명하기 위해 그림을 사용하겠습니다.

모든 반복에 대한

Algo flow

압연 함수는 윈도우 데이터의 최대 값을 계산하게하고; 다음 최대 DATA의 같은 인덱스의 POINT 1.

최종 결과에 의해 증가된다 :

DataFrame end

당신이 파이썬 코드를 좀 도와 줄래?

정말 고맙습니다.

지우베르투에게, 당신의 시간을 사전에

추신 : 감사합니다 Jupyter Notebook 형식의 셀을 Stackoverflow 편집 창에 복사하여 붙여 넣는 방법을 제안 할 수 있습니까? 고맙습니다.

+1

복사 인쇄'의 출력을 (DF) '을 선택하고, 툴바의 코드 ('{}) '버튼으로 모두 포맷하십시오. [재현성 좋은 팬더 예제를 만드는 방법] (http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)도 참조하십시오. – IanS

+0

"모든 반복에 대해 롤링 함수는 창에있는 데이터의 최대 값을 계산 한 다음 최대 DATA의 동일한 인덱스에있는 POINT를 1 씩 증가시킵니다. - 이해가 안되네 :이 점을'(df.DATA.rolling (4) .max() == df.DATA) .astype (int)'에 의해 'POINTS'가 증가하지 않습니까? 하지만 출력 결과에 맞지 않습니다. –

+1

@AmiTavory, 내가 이해하는 방식으로 처음 세 개의 롤링 윈도우는 인덱스 2에서 최대 값을 가지므로 인덱스 2에서 'POINTS'값은 세 번 증가합니다. 네 번째 롤링 창은 더 이상 색인 2를 포함하지 않으므로 알고리즘이 계속 이동합니다. 재미있는 문제는, 내가 말하고 싶은데 ... – IanS

답변

2

IIUC @IanS에 의해 설명 (! 다시 한번 감사), 당신은

In [75]: np.array([df.DATA.rolling(4).max().shift(-i) == df.DATA for i in range(4)]).T.sum(axis=1) 
Out[75]: array([0, 0, 3, 0, 0, 0, 3, 0, 0]) 

이 열 업데이트하려면 수행 할 수 있습니다

In [78]: df = pd.DataFrame({'DATA':s, 'POINTS':0}) 

In [79]: df.POINTS += np.array([df.DATA.rolling(4).max().shift(-i) == df.DATA for i in range(4)]).T.sum(axis=1) 

In [80]: df 
Out[80]: 
    DATA POINTS 
0  1  0 
1  2  0 
2  3  3 
3  2  0 
4  1  0 
5  2  0 
6  3  3 
7  2  0 
8  1  0 
+0

대단히 감사합니다 @ AmiTavory! 필자의 파이썬 지식은 여전히 ​​가난하지만, 당신의 답은 저에게 많은 도움이됩니다. – Gilberto

+0

그리고 내 질문을 명확히하기 위해 @IanS에 도움을 주셔서 감사합니다. – Gilberto

1
import pandas as pd 

s = pd.Series([1,2,3,2,1,2,3,2,1])  
df = pd.DataFrame({'DATA':s, 'POINTS':0}) 

df.POINTS=df.DATA.rolling(4).max().shift(-1) 
df.POINTS=(df.POINTS*(df.POINTS==df.DATA)).fillna(0)