如何引用熊猫数据框列中的先前元素以根据满足的条件计算更多元素

哈里森霍奇

我正在尝试创建一个循环,它将根据列中的先前值填充一列。

基本上我想看看在上一行中“购买列”是否等于 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 的连续行)这个函数:

  • 设置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

然后在包含另一行的源 DataFrame 上测试它,该行具有连续的Date并且PurchaseSell_Check == 0。最后返回的值将为0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何计算熊猫数据框中条件元素之间的变化

如何根据另一列中满足的条件在熊猫数据框中添加新列?

根据熊猫数据框中的条件从列表中删除元素

根据熊猫数据框中的条件从列表中删除元素

如何根据其中一列中的元素总结熊猫数据框的列

计算数据框列中许多元素的出现次数

计算元素时如何在熊猫数据框中添加新列?

根据数据框中的位置计算元素

如何根据条件在熊猫数据框中创建新列?

如何根据另一列计算数据框中的公共元素

单击网格元素以显示更多元素颤动

如何根据条件交叉引用数据框中的列?

如何计算熊猫数据框中满足布尔条件的时间间隔的数量?

检查元素是否在列表中,如果条件满足,则写入 Pandas 数据框中的新列

如何在满足条件的熊猫数据框中查找数据的索引和列?

识别满足条件的数据框的元素

如何在javascript的文本框中为输入的值创建更多元素?

如何使用 PostgresSQL 计算满足组中条件的元素

根据列中的值从熊猫数据框中的列表中删除元素

计算熊猫数据框中列中每个值的列表中每个元素的性能

如何根据不同的条件从先前按特定列分组的数据框中采样行?

计算差异选定元素熊猫数据框列

如何计算满足多个条件的数据框中的行数?

从熊猫数据框中过滤元素以进行统计分析

如何根据元素的频率对熊猫数据框进行颜色编码?

根据字典列表中的元素创建熊猫数据框

如何根据熊猫数据框中的某些条件计算比率公式

计算熊猫数据框中的重复元素

熊猫:根据其组内元素的相对索引在多索引数据框中创建列