Python 如何引用dataframe列中以前的元素以根据满足的条件计算进一步的元素
我试图创建一个循环,它将根据列中以前的值填充列 基本上,我想看看前一行中的“购买列”是否等于1,如果是这样,我希望“持有列”包含5,直到“卖出支票”列显示为1,此时我希望持有列显示为a-1 我试过:Python 如何引用dataframe列中以前的元素以根据满足的条件计算进一步的元素,python,pandas,loops,Python,Pandas,Loops,我试图创建一个循环,它将根据列中以前的值填充列 基本上,我想看看前一行中的“购买列”是否等于1,如果是这样,我希望“持有列”包含5,直到“卖出支票”列显示为1,此时我希望持有列显示为a-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['S
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 ) )
第一部分做得很好,但直到卖出支票=1时,才继续增加5
我也试过:
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
但是这个返回的“keyrerror: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
使用“记忆功能”定义以下功能: 提到的“内存特性”是作为prevVal属性实现的 这项职能的作用 此属性将在第一次调用之前设置为初始值(0) 然后,在每个应用程序(到df的连续行)上,此函数:
- 设置prevVal的返回值(rv)
- 然后有条件地将prevVal更改为5或-1
- 但该值将在下一次时返回
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
然后在包含另一行的连续
日期和购买和销售检查=0。
最后返回的值将为0。请添加示例数据和预期结果(以文本形式,而不是图片形式)。添加,希望此帮助非常有效非常感谢,很抱歉我的示例有点混乱,我修改了“购买”和“出售”列,试图在“保留”列中提供我想要的具体示例,而没有想到这会让事情变得混乱。我想问的最后一件事是,您提供的代码运行良好,但如果在返回初始值-1后返回0,则会使我希望执行的后续计算变得更容易。基本上只有5继续运行,而不是-1
getHold.prevVal = 0 # Set the initial value of "prevVal"
df['Hold'] = df.apply(getHold, axis=1)
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