2017-08-01 26 views
0

我必須使用apply來訪問當前行的值和先前計算的值。以下是代碼片段。我如何優化此代碼以更快地工作?使用pandas訪問兩個軸應用函數

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randint(0,100,size=(30, 1)), columns=['ABCD']) 

for idx in range(0, len(df)): 
    df.ix[idx, 'flag'] = 0 
    if 0 == idx: 
     continue 
    if df.ix[idx, 'ABCD'] >= 66: 
     df.ix[idx, 'flag'] = 1 
    elif df.ix[idx, 'ABCD'] <= 33: 
     df.ix[idx, 'flag'] = 0 
    else: 
     df.ix[idx, 'flag'] = df.ix[idx-1, 'flag'] 

print df 

在這裏,我必須使用'ABCD'中的值。如果值大於66,則應將標誌設置爲1並且< 33,標誌應爲0. 對於其他值,它應該重複以前的標誌值。

請讓我知道如何優化此功能?

回答

0

您可以使用np.where矢量化if/else;組標誌爲1時的值> = 66,0當值< = 33,否則的NaN然後做一個向前該結果填寫flag柱:

df['flag0'] = pd.np.where(df.ABCD >= 66, 1, 
       pd.np.where(df.ABCD <= 33, 0, pd.np.nan)) 
​ 
df['flag0'] = df['flag0'].ffill() 

(df.flag == df.flag0).all() 
# True 
+0

感謝。這樣做的工作速度非常快。 –