我对包含数据帧的foor循环有问题

时间:2019-07-05 02:27:21

标签: pandas dataframe for-loop operation

我有一个8列的数据框。如果其中两列满足条件,则必须用其他两列的乘积填充两列。并且在运行算法后,它不起作用。

我尝试使用系列,我尝试使用导入警告 warnings.filterwarnings("ignore"),但不起作用

for i in seq:

     if dataframefinal['trade'][i] == 1 and dataframefinal['z'][i] > 0:

         dataframefinal['CloseAdj2'][i]= dataframefinal['Close2'][i] * 
         dataframefinal['trancosshort'][i]
         dataframefinal['CloseAdj1'][i]= dataframefinal['Close1'][i] * 
         dataframefinal['trancostlong'][i]

    elif dataframefinal['trade'][i] == 1 and dataframefinal['z'][i] < 0:
        dataframefinal['CloseAdj2'][i]= dataframefinal['Close1'][i] * 
        dataframefinal['trancosshort'][i]
        dataframefinal['CloseAdj1'][i]= dataframefinal['Close2'][i] * 
        dataframefinal['trancostlong'][i]

    else:
        dataframefinal['CloseAdj1'][i]= dataframefinal['Close1'][i]
        dataframefinal['CloseAdj2'][i]= dataframefinal['Close2'][i]

1 个答案:

答案 0 :(得分:0)

您可以使用向量化条件函数numpy.select()快速执行此操作:

import pandas as pd
from numpy.random import randn, randint

n = 10
df_data = pd.DataFrame(dict(trade=randint(0, 2, n), 
                       z=randn(n), 
                       Close1=randn(n), 
                       Close2=randn(n), 
                       trancosshort=randn(n), 
                       trancostlong=randn(n)))

df_data["CloseAdj1"] = 0
df_data["CloseAdj2"] = 0

seq = [1, 3, 5, 7, 9]

df = df_data.loc[seq]

cond1 = df.eval("trade==1 and z > 0")
cond2 = df.eval("trade==2 and z < 0")

df["CloseAdj2"] = np.select([cond1, cond2], 
          [df.eval("Close2 * trancosshort"), 
           df.eval("Close1 * trancosshort")], df.Close2)

df["CloseAdj1"] = np.select([cond1, cond2], 
          [df.eval("Close1 * trancostlong"), 
           df.eval("Close2 * trancostlong")], df.Close1)

df_data.loc[seq, ["CloseAdj1", "CloseAdj2"]] = df[["CloseAdj1", "CloseAdj2"]]