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')
任何建议表示赞赏!!
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_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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
669 次 |
| 最近记录: |