2016-04-22 94 views
0

我正在处理大型数据集,我需要查看同一列中的下一行值是否大于当前值。然后保存1或-1。因此,如果col d中的当前行为1,并且同一col中的下一个值为2,则它会在同一行和同一数据帧中的新列('e)上保存1。问题是它总是保存一个单一的值。DataFrame不保存正确的值

import numpy as np 
import pandas as pd 

df1 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd']) 
mask = df1.applymap(lambda x: x <-0.7) 
df1 = df1[-mask.any(axis=1)] 
sLength = len(df1['a']) 


rwno=0 
PrevClose=[] 
for index,row in df1.iterrows(): 
    Close=row.iloc[3] 
    PrevClose.append(Close) 
    rwno+=1 


print df1 
rwno=1 
for index,row in df1.iterrows(): 
    NxtDaySpy=0 
    if rwno < len(df1.index) : 
     NextClose=PrevClose[rwno] 
     Close=row.iloc[3] 
     df1['e']=pd.Series((NextClose-Close)/abs(NextClose-Close), index=df1.index) 

    rwno+=1 


print df1.head 

回答

1

假设您为了简单起见只有一列的数据帧。

np.random.seed(14) # so you can reproduce 
df = pd.DataFrame(np.random.randn(10, 1), columns=['a']) 
df.head() 

--------- 
a 
--------- 
1.331587 
1.331587 
0.715279 
-1.545400 
-0.008384 
0.621336 

您可以使用shift()来延迟(或引导)您的数据。

df['a_new'] = df.shift(periods=1).fillna(0.0) 
df.head() 

--------------------- 
a   a_new 
--------------------- 
1.331587 0.000000 
0.715279 1.331587 
-1.545400 0.715279 
-0.008384 -1.545400 
0.621336 -0.008384 

,然后用列表解析,让您1的和-1的。

df['a_flags'] = [1 if x > y else -1 for x, y in zip(df.a, df.a_new)] 
df.head() 

------------------------------- 
a   a_new  a_flag 
------------------------------- 
1.331587 0.000000 1 
0.715279 1.331587 -1 
-1.545400 0.715279 -1 
-0.008384 -1.545400 1 
0.621336 -0.008384 1 
+0

我以一种不同的方式使用了这个逻辑,但是这个工作很完美。 – newtooca