如果记录满足条件,则Python将列值与上一个记录值偏移
我是Python的新手,一直在研究如何有条件地偏移值。当我只需要创建一个新列时,我已经成功地使用了shift函数。但是,这似乎不适用于函数 原始df:如果记录满足条件,则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
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