我正在尝试在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列[&#39; Out2&#39;]尝试以矢量化形式复制A [&#39; Out&#39;],但不会读取之前的值。 A列[&#39; Out&#39;]需要很长时间才能通过循环进行编译。有人可以通过更快速的矢量化方法帮助我创建此列吗?
答案 0 :(得分: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