Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果后续值为非零值,则将零值替换为ffill non-zero_Python_Pandas_Fill_Zero - Fatal编程技术网

Python 如果后续值为非零值,则将零值替换为ffill non-zero

Python 如果后续值为非零值,则将零值替换为ffill non-zero,python,pandas,fill,zero,Python,Pandas,Fill,Zero,我需要将pandas中的“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.

我需要将pandas中的“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

df.val.shift(-1)!=0始终为真,因为
NaN!=0
。如果最后一行中的0前面有一个非零值(并且假设OP不希望最后一行中的0在这种情况下向前填充),则可能会出现问题。使用
(df['val']!=0.shift(-1)=True
而不是
df.val.shift(-1)!=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