如果记录满足条件

时间:2016-06-30 17:57:53

标签: 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
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')

任何建议表示赞赏!!

2 个答案:

答案 0 :(得分:5)

您可以使用maskffill

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 TrueNaN中的值替换为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']