2017-07-28 3 views
1

J'essaie de créer une colonne dans pandas qui est conditionnelle à sa valeur précédente avec d'autres colonnes.Colonne auto-conditionnelle 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())))) 

La colonne A [OUT2] essaie de copier A [ 'Out'] sous une forme vectorisée, mais ne lit pas les valeurs précédentes. La colonne A ['Out'] prend trop de temps à compiler à travers une boucle. Quelqu'un peut-il m'aider avec une approche plus rapide et vectorisée pour créer cette colonne?

+1

Pouvez-vous fournir votre sortie désirée et une entrée par exemple? – asongtoruin

Répondre

1

Vous pouvez créer une fonction, puis utiliser apply. Pour accéder aux données précédentes, vous pouvez utiliser une variable pour stocker cette valeur. Espérons que le code suivant aide.

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)) 

Sortie:

 
      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  

Si vous utilisez %%timeit

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

C'est parfait ... Merci pour la réponse rapide !! –

+0

Vous êtes les bienvenus @random_black. Ne oubliez pas d'upvote lorsque vous avez assez de réputation – Dark