2016-08-25 5 views
2

Я знаю, что аналогичные версии этого вопроса были заданы, и я видел ответы no, или смотрю на roll_apply, но до сих пор не видел, как я могу реализовать более быструю версию этого кода, хотя кажется, что это должно быть возможным.Может ли DataFrame.apply ссылаться на предыдущие строки?

В кадре данных я хочу создать столбец, значения которого либо равны другому столбцу, либо равны его предыдущему значению (ранняя строка) в зависимости от второго столбца. Я могу сделать это в цикле, но он медленный.

import pandas as pd 

df = pd.DataFrame({'a':[0,1,2,0,1,2,0,1,2],'t':[0,1,2,3,4,5,6,7,8]}) 

startTime = df.loc[0,'t'] 
df.loc[:,'startTime'] = startTime 

for idx in range(df.shape[0]): 
    if df.loc[idx,'a'] == 0: 
     startTime = df.loc[idx,'t'] 
    df.loc[idx,'startTime'] = startTime 

df 

ответ

3

Будет ли это работать?

df['startTime'] = df.loc[df['a']==0, 't'].reindex(df.index).ffill() 

df 
Out: 
    a t startTime 
0 0 0  0.0 
1 1 1  0.0 
2 2 2  0.0 
3 0 3  3.0 
4 1 4  3.0 
5 2 5  3.0 
6 0 6  6.0 
7 1 7  6.0 
8 2 8  6.0 
+1

Слишком быстро для меня +1 – piRSquared

+1

Отлично! Это хорошо работает для меня, используя этот код для моего фактического кода, а не для демонстрации, я нашел одну рекомендацию, чтобы сделать это более общим для переиндексации в df.index. Спасибо –

+1

@PaulFleming Ах да, это была ошибка, с которой только что случилось, потому что 'df ['t']' и 'df.index' одинаковы. Я думал, что передал индекс 'df ['t']'. Отредактировано сейчас, спасибо. – ayhan

Смежные вопросы