对于复杂的“如果”条件,数据帧使用前一行值来确定当前值

我想知道是否有更快的方法来执行以下循环?可以使用应用或滚动应用功能来实现这一点
基本上,我需要访问前一行的值来确定当前单元格的值

df.ix[0]=(np.abs(df.ix[0])>=So)*np.符号(df.ix[0])
对于范围(1,len(df))中的i:
对于列表中的列(df.columns.values):
如果((df[col].ix[i]>1.25)&(df[col].ix[i-1]==0)):
df[col].ix[i]=1
elif((df[col].ix[i]<-1.25)和(df[col].ix[i-1]==0)):
df[col].ix[i]=-1
elif((df[col].ix[i]<=-0.75)和(df[col].ix[i-1]<0))|((df[col].ix[i]>=0.5)和(df[col].ix[i-1]>0)):
df[col].ix[i]=df[col].ix[i-1]
其他:
df[col].ix[i]=0

如您所见,在函数中,我正在更新数据帧,我需要访问最新的前一行,因此使用shift将不起作用

例如:
输入:

A B C
1.3  -1.5   0.7
1.1  -1.4   0.6
1.0  -1.3   0.5
0.4   1.4   0.4

输出:

A B C
1     -1      0
1     -1      0
1     -1      0
0      1      0

可以使用.shift()函数访问上一个下一个值:

col列的上一个值:

df['col'].shift()

col列的下一个值:

df['col'].shift(-1)

例如:

[38]on

:df
Output[38]:
a、b、c
0  1  0  5
1  9  9  2
2  2  2  8
3  6  3  0
4  6  1  7
At[39]on:df['prev_a']=df['a'].shift()
In[40]:df
Output[40]:
上一篇
01105NaN
1  9  9  2     1.0
2  2  2  8     9.0
3  6  3  0     2.0
4  6  1  7     6.0
At[43]on:df['next_a']=df['a'].shift(-1)
In[44]:df
Output[44]:
a b c上一个a下一个a
01105NAN9.0
1  9  9  2     1.0     2.0
2  2  2  8     9.0     6.0
3  6  3  0     2.0     6.0
461766.0NAN

发表评论