Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自条件列_Python_Pandas_Numpy_Vectorization - Fatal编程技术网

Python 自条件列

Python 自条件列,python,pandas,numpy,vectorization,Python,Pandas,Numpy,Vectorization,我正在尝试在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['O

我正在尝试在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()))))
将熊猫作为pd导入
将numpy作为np导入
a=np.随机。标准_正常(100)
A=pd.数据帧(A)
A['Out']=0
A['Out2']=0
对于范围(1,A.shape[0])内的t:
如果(A[0][t]>1)和(A['Out'][t-1]==0):
A['Out'][t]=1
(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
其他:
A['Out'][t]=A['Out'][t-1]
A['Out2']=np.其中((A.index==0),0
,np.其中((A[0]>1)和(A['Out2'].shift()==0),1
,np.其中((A[0]<-1)和(A['Out2'].shift()==0),-1
,np.其中((A[0]>0)和(A['Out2'].shift()=-1))|((A[0]<0)和(A['Out2'].shift()==1)),0
,A['Out2'].shift())

列A['Out2']尝试以矢量形式复制['Out'],但不读取以前的值。列A['Out']通过循环编译花费的时间太长。有人能帮我用一种更快、矢量化的方法来创建此列吗?

您可以创建一个函数,然后使用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))

你能提供你想要的输出和示例输入吗?这是完美的。。。谢谢你的快速回复!!欢迎你@random_black。当你获得足够的声誉时,别忘了投票 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
100 loops, best of 3: 2.16 ms per loop