如果记录满足条件,则使用先前记录值的Python偏移列值

Amb*_* Z. 4 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
Run Code Online (Sandbox Code Playgroud)

我希望将BEGIN值更改为先前的记录BEGIN值,并将SPEED值更改为SPEED记录where SPEED=0和previous 之前的记录值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
Run Code Online (Sandbox Code Playgroud)

我尝试了很多不同的东西.目前,我试过:

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)
Run Code Online (Sandbox Code Playgroud)

但这给了我错误:

AttributeError :("'float'对象没有属性'shift'",u'occurred在索引0')

任何建议表示赞赏!!

roo*_*oot 5

你可以使用maskffill:

begin_cond = (df['SPEED'] == 0) & (df['SPEED_END'].shift(1) == 0)
df['BEGIN'] = df['BEGIN'].mask(begin_cond).ffill().astype(int)
Run Code Online (Sandbox Code Playgroud)

从本质上讲,mask将取代值df['BEGIN'],其中begin_condTrueNaN.然后,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
Run Code Online (Sandbox Code Playgroud)