2016-08-25 3 views
2

この質問の似たようなバージョンが尋ねられました。私はnoの回答を見たことがありますか、rolling_applyを見ていますが、このコードのより高速版をどのように実装できるか見ていません。可能でなければならない。DataFrame.applyは前の行を参照できますか?

データフレームでは、値が別の列と等しいか、2番目の列に応じて前の値(前の行)と等しい列を作成したいとします。私はループでこれを行うことができますが、それは遅いです。

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

関連する問題