2017-10-10 26 views
0

我有以下数据帧熊猫移位整列向上有条件

 year dayofyear   x  
360 2014  361 109357.2798 
361 2014  362 106484.6514 
362 2014  363 112627.1748 
363 2014  364 99750.2315 
364 2014  365 56330.7660 
365 2014  366   NaN 
366 2015   1 60859.1082 
367 2015   2 99507.1793  
368 2015   3 92279.8554 
369 2015   4 106590.6594 

我想的所有值在列移位的“x”的下面的NaN向上一个位置。 'year'和'dayofyear'中的值应该保持不变。

因此所需的输出将如下所示:

 year dayofyear   x  
360 2014  361 109357.2798 
361 2014  362 106484.6514 
362 2014  363 112627.1748 
363 2014  364 99750.2315 
364 2014  365 56330.7660 
365 2014  366 60859.1082 
366 2015   1 99507.1793 
367 2015   2 92279.8554  
368 2015   3 106590.6594 
369 2015   4 NaN 

我打周围pd.shift(-1),但这种移动的整列。我只需要将NaN下面的值向后移1,有没有人有一个很好的解决方案呢?

回答

2

这里有一种方法

In [401]: s = df['x'].isnull() 

In [403]: df.loc[s[s].index[0]:, 'x'] = df['x'].shift(-1) 

In [404]: df 
Out[404]: 
    year dayofyear   x 
360 2014  361 109357.2798 
361 2014  362 106484.6514 
362 2014  363 112627.1748 
363 2014  364 99750.2315 
364 2014  365 56330.7660 
365 2014  366 60859.1082 
366 2015   1 99507.1793 
367 2015   2 92279.8554 
368 2015   3 106590.6594 
369 2015   4   NaN 

详细

In [405]: s 
Out[405]: 
360 False 
361 False 
362 False 
363 False 
364 False 
365  True 
366 False 
367 False 
368 False 
369 False 
Name: x, dtype: bool 

In [406]: s[s].index 
Out[406]: Int64Index([365], dtype='int64') 

In [407]: s[s].index[0] 
Out[407]: 365