如果后续值为非零,则将 pandas 零值替换为 ffill 非零值
Replace pandas zero value with ffill non-zero, if the subsequent value is non-zero
我需要将 pandas 中的“0”行数据替换为前几行的非零值 IF 和 ONLY IF,“0”之后的行中的值是非零的。
即
101
92
78
0
107
0
0
会变成:
101
92
78
78
107
0
0
任何想法如何做到这一点将不胜感激:-)
谢谢!
使用shift
你可以做到
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
这个答案与 相似,但相比之下更快:
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
我需要将 pandas 中的“0”行数据替换为前几行的非零值 IF 和 ONLY IF,“0”之后的行中的值是非零的。
即
101
92
78
0
107
0
0
会变成:
101
92
78
78
107
0
0
任何想法如何做到这一点将不胜感激:-)
谢谢!
使用shift
你可以做到
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
这个答案与
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