2016-08-25 2 views
2

Ich weiß, dass ähnliche Versionen dieser Frage gestellt wurden, und ich habe Antworten von nein gesehen, oder schaue auf rolling_apply, aber bisher habe ich noch nicht gesehen, wie ich eine schnellere Version dieses Codes implementieren kann, obwohl es scheint sollte möglich sein.Kann DataFrame.apply auf vorherige Zeilen verweisen?

In einem Datenframe möchte ich eine Spalte erstellen, deren Werte entweder gleich einer anderen Spalte oder gleich ihrem vorherigen Wert (frühere Zeile) abhängig von einer zweiten Spalte sind. Ich kann das in einer Schleife machen, aber es ist langsam.

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 

Antwort

3

Würde das funktionieren?

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

Zu schnell für mich +1 – piRSquared

+1

Perfekt! Das funktioniert gut für mich, wenn ich diesen Code auf meinen tatsächlichen Code und nicht auf die Demo verwende, fand ich eine Empfehlung, dies genereller zu machen, wäre es, df.index neu zu indizieren. Vielen Dank –

+1

@PaulFleming Ah ja, das war ein Fehler gerade passiert, weil 'df ['t']' und 'df.index' sind gleich. Ich dachte, ich hätte 'df ['t'] 's index übergeben. Editiert jetzt, danke. – ayhan

Verwandte Themen