2017-07-13 117 views

回答

4

你可以做

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 
+0

'df.val.shift(-1)的最後一排! = 0'總是爲真,因爲'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