2017-07-28 19 views
1

私は、他の列と共に前の値に条件付きである列をパンダに作成しようとしています。Pandas自己条件付き列

import pandas as pd 
import numpy as np 
a = np.random.standard_normal(100) 
A = pd.DataFrame(a) 
A['Out'] = 0 
A['Out2'] = 0 
for t in range(1,A.shape[0]): 
    if (A[0][t] > 1) & (A['Out'][t-1]==0): 
     A['Out'][t] = 1 
    elif (A[0][t] < -1) & (A['Out'][t-1]==0): 
     A['Out'][t] = -1 
    elif ((A[0][t] > 0) & (A['Out'][t-1]==-1)) | ((A[0][t] < 0) & (A['Out'][t-1]==1)): 
     A['Out'][t] = 0 
    else: 
     A['Out'][t] = A['Out'][t-1] 
A['Out2'] = np.where((A.index== 0),0 
     ,np.where((A[0] > 1) & (A['Out2'].shift()==0), 1 
     ,np.where((A[0] < -1) & (A['Out2'].shift()==0), -1 
     ,np.where(((A[0] > 0) & (A['Out2'].shift()==-1)) | ((A[0] < 0) & (A['Out2'].shift()==1)), 0 
     ,A['Out2'].shift())))) 

カラムA [「OUT2は」]ベクトル形式で[「アウト」]をコピーしようとするが、前の値を読み取りません。列A ['Out']はループをコンパイルするのに時間がかかりすぎます。誰かがこの列を作成するためのベクトル化されたより速いアプローチで私を助けることができますか?

+1

を使用した場合と例入力? – asongtoruin

答えて

1

関数を作成してからapplyを使用できます。以前のデータにアクセスするには、変数を使用してその値を格納します。次のコードが役立つことを願っています。

import pandas as pd 
import numpy as np 
a = np.random.standard_normal(100) 
A = pd.DataFrame(a) 
state = 0 
def get_val(A,prev_state): 
    global state 
    if (A > 1) & (prev_state==0): 
     state = 1 
    elif (A < -1) & (prev_state==0): 
     state = -1 
    elif ((A > 0) & (prev_state==-1)) | ((A < 0) & (prev_state==1)): 
     state = 0  
    return state 

A['Out'] = A[0].apply(lambda x: get_val(x,state)) 

出力:

 
      0 Out 
0 1.366864 1  
1 0.887763 1  
2 -0.663636 0  
3 -1.824950 -1  
4 0.459663 0  
5 -1.325129 -1  
6 1.587188 0  
7 -0.148159 0  
8 0.578862 0  
9 0.758460 0  

あなたがあなたの所望の出力を提供することができます%%timeit

100 loops, best of 3: 2.16 ms per loop 
+0

これは完璧です...迅速な対応に感謝します! –

+0

@random_blackようこそ。あなたが十分な評判を得たときupvoteを忘れないでください – Dark

関連する問題