2016-10-14 7 views
5

Мне нужно создать столбец, который начинается с начального значения, а затем генерируется функцией, которая включает в себя прошлые значения этого столбца. НапримерPandas: создание столбца с актуальными значениями привязки

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 

Теперь я хочу, чтобы создать остальную часть столбца «Ъ», взяв минимум предыдущего ряда и добавив два. Одним из решений было бы

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

Результирующее в желаемом выходе

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 

Есть ли у панды на «чистый» способ сделать это? Предпочтительно, чтобы векторизация вычислений?

+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 
Смежные вопросы