2016-12-14 3 views
5

私は、以下のフォーマットの時系列データを持っています。ここで、値は過去の記録からの累積量を示します。これを行うための慣用パンダの方法はありカスタムフィルナへのパンダの慣用方法

2016-01-01  0.0 
2016-01-02  0.0 
2016-01-03 25.0 
2016-01-04 25.0 
2016-01-05 25.0 
2016-01-06 10.0 
2016-01-07 10.0 
2016-01-08 10.0 
2016-01-09 10.0 
2016-01-10 10.0 

s = pd.Series([0, 0, np.nan, np.nan, 75, np.nan, np.nan, np.nan, np.nan, 50], 
       pd.date_range(start="Jan 1 2016", end="Jan 10 2016", freq='D')) 

2016-01-01  0.0 
2016-01-02  0.0 
2016-01-03  NaN 
2016-01-04  NaN 
2016-01-05  75.0 
2016-01-06  NaN 
2016-01-07  NaN 
2016-01-08  NaN 
2016-01-09  NaN 
2016-01-10  50.0 

この出力次のようになります。私は何をしたい、この入力ようにはNaNを含む過去の期間にわたりその蓄積量を「拡散」です単にデータのforループを実行するのではなく、私は、fillnadropnaisnullshiftを実行して次の値をチェックするなどさまざまなことを試しましたが、どのように一緒に配置するのか分かりません。

+0

興味深い質問。私は組み込みの方法はないと思っています。残念ながら、あなたはループを終わらせなければならないかもしれません。 –

答えて

5

これは、欠損値の各チャンクのために、動作(一連の端部から)cumsumとグループ変数を作成し、各チャンクにグループ化された平均操作を行う可能性がある:

s.groupby(s.notnull()[::-1].cumsum()[::-1]).transform(lambda g: g[-1]/g.size) 

#2016-01-01  0.0 
#2016-01-02  0.0 
#2016-01-03 25.0 
#2016-01-04 25.0 
#2016-01-05 25.0 
#2016-01-06 10.0 
#2016-01-07 10.0 
#2016-01-08 10.0 
#2016-01-09 10.0 
#2016-01-10 10.0 
#Freq: D, dtype: float64 

または別のオプション:

s.groupby(s.shift().notnull().cumsum()).transform(lambda g: g[-1]/g.size) 

#2016-01-01  0.0 
#2016-01-02  0.0 
#2016-01-03 25.0 
#2016-01-04 25.0 
#2016-01-05 25.0 
#2016-01-06 10.0 
#2016-01-07 10.0 
#2016-01-08 10.0 
#2016-01-09 10.0 
#2016-01-10 10.0 
#Freq: D, dtype: float64 
関連する問題