我是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
值{ {1}}和之前的SPEED=0
。
所以上面的表应该是:
SPEED_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
但这给了我错误:
AttributeError :(“'float'对象没有属性'shift'”,u'occurred at index 0')
任何建议表示赞赏!!
答案 0 :(得分:5)
begin_cond = (df['SPEED'] == 0) & (df['SPEED_END'].shift(1) == 0)
df['BEGIN'] = df['BEGIN'].mask(begin_cond).ffill().astype(int)
基本上,mask
会将df['BEGIN']
begin_cond
True
与NaN
中的值替换为ffill
。然后,NaN
将使df['BEGIN']
中的最后一个有效值填充 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
值。
结果输出:
conda create
答案 1 :(得分: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']