2016-12-14 13 views
5

Zaman serisi verilerinin, geçmiş kayıttan bu yana birikmiş bir miktarı gösterdiği, aşağıdaki biçimde var. Bunu yapmak için bir deyimsel Pandalar yolu var mıPandalar özel fillna için deyimsel yol

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 

bu çıkış Oldu: Ne yapmak istediğinizi bu girişin böylece NaN içeren geçmiş dönemlerde olduğu birikmiş tutarı "yaymak" olduğunu Veriler için sadece bir döngü yapmak yerine? Ben vb sonraki değerini kontrol etmek shift yapıyor fillna, dropna, isnull içeren çeşitli şeyler denedim ama parçaları bir araya nasıl göremez.

+0

ilginç bir soru. Yerleşik bir yol olduğunu düşünmüyorum ve maalesef, döngü yapmak zorunda kalabilirsiniz. –

cevap

5

Bu, kayıp değerlerinin her bir parça için, çalışma (seri sonundan) cumsum ile bir grup değişken oluşturmak ve daha sonra her bir yığın üzerinde gruplanmış ortalama işlemi gerçekleştirebilir:

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 

veya başka bir seçenek:

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