2016-10-14 2 views
5

초기 값으로 시작하는 열을 생성해야하며 그 열의 과거 값을 포함하는 함수로 생성해야합니다. 예를 들어팬더 : 자체 참조 이전 값이있는 열 작성

df = pd.DataFrame({'a': [1,1,5,2,7,8,16,16,16]}) 
df['b'] = 0 
df.ix[0, 'b'] = 1 
df 

    a b 
0 1 1 
1 1 0 
2 5 0 
3 2 0 
4 7 0 
5 8 0 
6 16 0 
7 16 0 
8 16 0 

지금, 나는 이전 행의 최소를 복용하고 두 가지를 추가하여 열 'B'의 나머지 부분을 생성합니다. 한 가지 해결책은 팬더는이 작업을 수행 할 수있는 '깨끗한'방법이 있습니까 원하는 출력

a b 
0 1 1 
1 1 3 
2 5 3 
3 2 5 
4 7 4 
5 8 6 
6 16 8 
7 16 10 
8 16 12 

결과

for i in range(1, len(df)): 
    df.ix[i, 'b'] = df.ix[i-1, :].min() + 2 

것입니까? 가급적 계산을 벡터화하는 것이 좋습니까?

+1

나는 반복을 포함하지 않는 방법을 생각할 수 없다. 하지만 당신이'.ix []'을 사용할 필요가 없다고 말할 것입니다; 'df.b [i] = df.iloc [i-1] .min() + 2'을 가질 수 있습니다. – chrisaycock

답변

5

pandas에는 일반적인 재귀 계산을 처리 할 수있는 좋은 방법이 없습니다. 벡터화하는 데는 몇 가지 트릭이 있지만, 종속성을 가질 수 있다면 numba을 사용하면 비교적 쉽고 빠릅니다.

@numba.njit 
def make_b(a): 
    b = np.zeros_like(a) 
    b[0] = 1 
    for i in range(1, len(a)): 
     b[i] = min(b[i-1], a[i-1]) + 2 

    return b 

df['b'] = make_b(df['a'].values) 

df 
Out[73]: 
    a b 
0 1 1 
1 1 3 
2 5 3 
3 2 5 
4 7 4 
5 8 6 
6 16 8 
7 16 10 
8 16 12