2016-12-14 11 views
6

Mam ramki danych z kolumną o nazwie SAM z następującymi danymiFill na wartości dodając X do poprzednich pand rzędowych

SAM 
3 
5 
9 
Nan 
Nan 
24 
40 
Nan 
57 

Teraz chcę wstawić 12, 15 i 43 odpowiednio w wartościach Nan (bo 9+3=12, 12+3=15 i 40+3=43). Innymi słowy wypełnij dowolny wiersz Nan, dodając 3 do poprzedniego wiersza (który może również być Nan).

Wiem, że można tego dokonać przez iterowanie przez pętlę for. Ale czy możemy to zrobić w wektorze? Podobnie jak niektóre zmodyfikowane wersje ffill (które mogły zostać użyte tutaj, gdybyśmy nie mieli kolejnych NaN) w pandas.fillna().

+1

W przyszłości proszę nie używać "
" do sformatowania pytania. – IanS

Odpowiedz

7

Można spróbować tej vectorized podejście:

nul = df['SAM'].isnull() 
nul.groupby((nul.diff() == 1).cumsum()).cumsum()*3 + df['SAM'].ffill() 

#0  3.0 
#1  5.0 
#2  9.0 
#3 12.0 
#4 15.0 
#5 24.0 
#6 40.0 
#7 43.0 
#8 57.0 
#Name: SAM, dtype: float64 
  1. podzielić brakujących wartości w serii na kawałki i dodać 3,6,9 itd pozycjom brakujących wartości w zależności od długości każdego fragmentu;
  2. Dodaje wypełnione wartości z kolumny SAM do wyniku.