如何引用dataframe列中以前的元素,以基于条件m计算进一步的元素

2024-04-23 07:50:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

基本上,我想看看前一行中的“购买列”是否等于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

Tags: andfordateshiftchecknpdtpurchase
1条回答
网友
1楼 · 发布于 2024-04-23 07:50:01

使用“记忆功能”定义以下功能:

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的连续行),此函数:

  • prevVal设置返回值(rv
  • 然后有条件地将prevVal更改为5-1
  • 但该值将在下一次时返回

要获得结果,请应用此函数,将结果保存在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

然后在包含另一行的连续 日期购买出售检查==0。 最后返回的值将是0

相关问题 更多 >