2017-05-21 10 views
1

に最も近い隣人の平均と値を逃した:入力プログラムは、私がデータフレーム持っている列

df = pd.DataFrame(data=[676, 0, 670, 0, 668], index=['2012-01-31 00:00:00','2012-02-29 00:00:00', 
                '2012-03-31 00:00:00','2012-04-30 00:00:00', 
                '2012-05-31 00:00:00']) 
df.index.name = "Date" 
df.columns = ["Number"] 

次のようになります。

   Number 
Date  
2012-01-31 00:00:00 676 
2012-02-29 00:00:00 0 
2012-03-31 00:00:00 670 
2012-04-30 00:00:00 0 
2012-05-31 00:00:00 668 

どのようにしてI入力2番目と4番目の値(676 + 670)/2および(670 + 668)/ 2は、

値をnp.arrayとして保存し、それらを配列で入力することはできますが、それはうんざりです!私はwhereメソッドを使用してnp.nanで任意の0を交換するために指定

答えて

2

0NaNと指定したら、fillnaメソッドを使用できます。 ffillbfillを使用することで、我々が対応する前と進むの値を持つすべてNaNを記入し、それらを追加し、2

df.where(df.replace(to_replace=0, value=np.nan), 
other=(df.fillna(method='ffill') + df.fillna(method='bfill'))/2) 

        Number 
Date      
2012-01-31 00:00:00 676.0 
2012-02-29 00:00:00 673.0 
2012-03-31 00:00:00 670.0 
2012-04-30 00:00:00 669.0 
2012-05-31 00:00:00 668.0 
+0

除算あなたは少し説明し提供してくださいだろうか? –

+0

@LadenkovVladislavそれは今意味がありますか? – spies006

+0

ありがとう!素敵な方法! –

1
#use apply to fill the Number with average from surrounding rows. 
df['Number'] = df.reset_index().apply(lambda x: df.reset_index()\ 
           .iloc[[x.name-1,x.name+1]]['Number'].mean() \ 
           if (x.name>0) & (x.Number==0) else x.Number,axis=1).values 

df 
Out[1440]: 
        Number 
Date      
2012-01-31 00:00:00 676.0 
2012-02-29 00:00:00 673.0 
2012-03-31 00:00:00 670.0 
2012-04-30 00:00:00 669.0 
2012-05-31 00:00:00 668.0 
関連する問題