Replace pandas zero value with ffill non-zero, if the subsequent value is non-zero

為{幸葍}努か 提交于 2021-02-07 19:29:48

问题


I need to replace "0" row data in pandas with the previous rows non-zero value IF and ONLY IF, the value in the row following the "0" is non zero.

I.e.

101
92
78
0
107
0
0

would become:

101
92
78
78
107
0
0

Any ideas how to do this would be much appreciated :-)

Thanks!


回答1:


using shift you could do

In [608]: df.loc[(df.val == 0) & (df.val.shift(-1) != 0), 'val'] = df.val.shift(1)

In [609]: df
Out[609]:
     val
0  101.0
1   92.0
2   78.0
3   78.0
4  107.0
5    0.0
6    0.0



回答2:


This is answer is similar to JohnGalt but it faster when compared:

In [12]: np.where((df.Val.values==0)&(df.Val.shift(-1)!=0),df.Val.shift(),df.Val)
Out[31]: array([ 101.,   92.,   78.,   78.,  107.,    0.,    0.])

In [24]: %timeit np.where((df.Val.values==0)&(df.Val.shift(-1)!=0),df.Val.shift(),df.Val)
1000 loops, best of 3: 671 µs per loop

In [25]: %timeit df.loc[(df.Val == 0) & (df.Val.shift(-1) != 0), 'val'] = df.Val.shift(1)
100 loops, best of 3: 2.01 ms per loop


来源:https://stackoverflow.com/questions/45080403/replace-pandas-zero-value-with-ffill-non-zero-if-the-subsequent-value-is-non-ze

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!