Python 如何引用dataframe列中以前的元素以根据满足的条件计算进一步的元素

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

我试图创建一个循环,它将根据列中以前的值填充列

基本上,我想看看前一行中的“购买列”是否等于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['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
  • 但该值将在下一次时返回
要获得结果,请应用此函数,并将结果保存在保留列中 (它甚至可能以前不存在):

就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
然后在包含另一行的连续 日期和购买和销售检查=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