2016-12-14 4 views
5

Ich habe Zeitreihendaten im folgenden Format, wo ein Wert eine kumulierte Menge seit der letzten Aufzeichnung angibt. Was ich tun möchte, ist „Spread“, dass die akkumulierte Menge in den letzten Perioden enthält NaN so dass dieser Eingang:Pandas idiomatic Weg zu benutzerdefinierten fillna

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 

Dieser Ausgang wird:

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 

Gibt es eine idiomatische Pandas Art und Weise, dies zu tun anstatt nur eine for-Schleife über die Daten zu machen? Ich habe versucht, eine Vielzahl von Dingen mit fillna, dropna, isnull, shift zu tun, um den nächsten Wert, usw. zu überprüfen, aber ich kann nicht sehen, wie man die Stücke zusammen setzt.

+0

Interessante Frage. Ich glaube nicht, dass es einen integrierten Weg gibt, und unglücklicherweise müssen Sie möglicherweise am Ende mit dem Looping beginnen. –

Antwort

5

Dies könnte für jedes Stück von fehlenden Werten arbeitet, eine Gruppenvariable mit cumsum (Ende der Serie) erstellen und dann auf jedem Chunk eine gruppierte durchschnittliche Operation durchführen:

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 

Oder eine andere Option:

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 
Verwandte Themen