如果后续数值不为零,则用 ffill 的非零值替换 pandas 数据库中的零值。

4

我需要用前面行的非零值替换pandas中的“0”行数据,但仅当下一行中的值为非零值时。

即:

101
92
78
0
107
0
0

would become:

101
92
78
78
107
0
0

任何关于如何做到这一点的想法都将不胜感激 :-) 谢谢!
2个回答

4

使用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

df.val.shift(-1) != 0 的最后一行总是 True,因为 NaN != 0。如果最后一行的 0 前面有非零值(并且假设 OP 不希望在这种情况下向前填充最后一行的 0),那么这可能会有问题。使用 (df['val'] != 0).shift(-1) == True 而不是 df.val.shift(-1) != 0 是一种解决方法。 - unutbu

1
这个答案类似于JohnGalt,但与之相比更快速:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接