我正在尝试创建一个循环,它将根据列中的先前值填充一列。
基本上我想看看在上一行中“购买列”是否等于 1,如果是,我希望“保持列包含 5”,直到“销售检查列读取 1”,此时我想要保持列到显示 -1。
我努力了:
dt['Hold'] = pd.np.where(dt['Purchase'].shift(1) ==1, pd.np.where(dt['Sell_Check'] != 1,5,-1),pd.np.where(dt['Hold'].shift(1) == 5 , pd.np.where(dt['Sell_Check'] != 1,5,-1),0 ) )
这在第一部分做得很好,但它没有继续添加 5 直到卖出支票 =1 。
我也试过:
for i in range (1, len(dt)):
if dt.loc[i-1, 'Purchase'] == 1 and dt.loc[i, 'Sell_Check'] != 1:
dt.loc[i , 'Hold'] = 5
elif dt.loc[i-1, 'Hold'] == 5 and dt.loc[i, 'Sell_Check'] != 1:
dt.loc[i, 'Hold'] = 5
elif dt.loc[i, 'Sell_Check'] == 1:
dt.loc[i, 'Hold'] = -1
else:
dt.loc[i, 'Hold'] = 0
但这会返回“keyerror:15”,这并没有告诉我太多。
任何帮助都会受到赞赏,如果我想要实现的目标不清楚,请告诉我,我会尝试解释更多
示例数据:它目前的样子:
Date Purchase Sell_Check Hold
0 20190107 0 0 0
1 20190108 1 0 0
2 20190109 0 0 5
3 20190110 0 0 0
4 20190111 1 0 0
5 20190114 0 1 -1
6 20190115 0 0 0
我希望它看起来像什么:
Date Purchase Sell_Check Hold
20190107 0 0 0
20190108 1 0 0
20190109 0 0 5
20190110 0 0 5
20190111 0 0 5
20190114 0 -1 5
20190115 0 0 -1
用“记忆功能”定义以下函数:
def getHold(row):
rv = getHold.prevVal
if row.Purchase == 1:
getHold.prevVal = 5
if row.Sell_Check == 1:
getHold.prevVal = -1
return rv
提到的“内存功能”是作为该函数的prevVal属性实现的。
此属性将在第一次调用之前设置为初始值 ( 0 )。
然后,在每个应用程序上(到df 的连续行)这个函数:
要获得结果,请应用此函数,将结果保存在Hold列中(之前甚至可能不存在):
getHold.prevVal = 0 # Set the initial value of "prevVal"
df['Hold'] = df.apply(getHold, axis=1)
就Hold列而言,结果如您所愿。
在您的预期结果中,我还看到其他列中的一些更改,但您只写了有关Hold列中值的设置。这就是为什么我认为其他列中的更改是您的错误。
如果-1只应返回一次,然后再次返回0,请将函数更改为:
def getHold(row):
rv = getHold.prevVal
if getHold.prevVal == -1:
getHold.prevVal = 0
if row.Purchase == 1:
getHold.prevVal = 5
if row.Sell_Check == 1:
getHold.prevVal = -1
return rv
然后在包含另一行的源 DataFrame 上测试它,该行具有连续的Date并且Purchase和Sell_Check == 0。最后返回的值将为0。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句