如果记录满足条件,则Python将列值与上一个记录值偏移

如果记录满足条件,则Python将列值与上一个记录值偏移,python,python-2.7,pandas,Python,Python 2.7,Pandas,我是Python的新手,一直在研究如何有条件地偏移值。当我只需要创建一个新列时,我已经成功地使用了shift函数。但是,这似乎不适用于函数 原始df: BEGIN SPEED SPEED_END 322 28 0 341 0 23 496 5 1 500 0 0 775 0 0 979 0 0 1015 0 0 1022 0 14 10

我是Python的新手,一直在研究如何有条件地偏移值。当我只需要创建一个新列时,我已经成功地使用了shift函数。但是,这似乎不适用于函数

原始df:

BEGIN   SPEED   SPEED_END
322     28      0
341     0       23
496     5       1
500     0       0
775     0       0
979     0       0
1015    0       0
1022    0       14
1050    11      6
我希望将
BEGIN
值更改为上一条记录
BEGIN
值,并将
SPEED
值更改为上一条记录
SPEED
值,其中
SPEED=0
和上一条
SPEED\u END=0

因此,上表应为:

BEGIN   SPEED   SPEED_END
322     28      0
322     28      23
496     5       1
500     0       0
500     0       0
500     0       0
500     0       0
500     0       14
1050    11      6
我试过很多不同的方法。目前,我已尝试:

def cont(row,param):
    if row['SPEED'] == 0 and row['SPEED_END'].shift(1) == 0:
        val = row[param].shift(1)
    else:
        val = row[param]
    return val

df['BEGIN'] = df.apply(cont, param='BEGIN', axis=1)
但这给了我一个错误:

AttributeError:(“'float'对象没有属性'shift',u'出现在索引0')


任何建议都将不胜感激

我将提出一个两步解决方案,这会让你大吃一惊

df['begin_temp'] = df.begin.shift(1)
df['begin_shifted'] = df.ix[( df.SPEED== 0)  | (df.SPEED_END== 0), 'begin_temp']
然后

df.ix[df.begin_shifted.isnull(),'begin_shifted'] = df.ix[df.begin_shifted.isnull(),'begin']
您可以使用和:

本质上,
mask
将用
NaN
替换
df['BEGIN']
中的值,其中
BEGIN\u cond
True
。然后,
ffill
将用
df['BEGIN']
中的最后一个有效值向前填充
NaN

结果输出:

   BEGIN  SPEED  SPEED_END
0    322     28          0
1    322      0         23
2    496      5          1
3    500      0          0
4    500      0          0
5    500      0          0
6    500      0          0
7    500      0         14
8   1050     11          6

谢谢这是非常接近工作!我在我的原始帖子中添加了更多的细节和数据行。我需要它循环通过,如果它改变了开始,然后如果下一条记录也满足相同的条件,那么更新开始为之前更新的开始。我希望这是有意义的。工作完美!非常感谢!!
   BEGIN  SPEED  SPEED_END
0    322     28          0
1    322      0         23
2    496      5          1
3    500      0          0
4    500      0          0
5    500      0          0
6    500      0          0
7    500      0         14
8   1050     11          6