2016-12-14 11 views
5

Mam dane szeregów czasowych w następującym formacie, w którym wartość wskazuje skumulowaną kwotę od czasu poprzedniego zapisu. Co chcę zrobić jest „spread” to zgromadzoną ilość w ciągu ostatnich okresach zawierających NaN tak że tego wejścia:Pandowy idiomatyczny sposób na wypełnienie niestandardowe

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 

Staje się to wyjście:

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 

Czy istnieje idiomatyczne Pandy sposobem, aby to zrobić zamiast po prostu wykonać pętlę dla danych? Próbowałem różnych rzeczy związanych z fillna, dropna, isnull, robi shift, aby sprawdzić kolejną wartość, itp., Ale nie widzę, jak umieścić kawałki razem.

+0

Interesujące pytanie. Nie sądzę, że jest wbudowany sposób i, niestety, być może będziesz musiał zakończyć pętlę. –

Odpowiedz

5

ten może działać, aby każda porcja brakujących wartości, tworzenie zmienną grupy z cumsum (od końca serii), a następnie przeprowadzić zgrupowanego średnią operacji na każdym fragmencie:

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 

Lub inna opcja:

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 
Powiązane problemy