2016-12-14 67 views
5

我有以下格式的时间系列数据,其中一个值表示自过去记录以来的累计数量。我想要做的是“传播”是累积金额超过含有楠过去的周期,使此输入:大熊猫惯用方式定制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 

变为输出:

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 

是否有地道的熊猫办法做到这一点而不只是做一个循环的数据?我已经尝试了多种涉及fillna,dropna,isnull,做shift来检查下一个值等,但我看不出如何把这些碎片放在一起。

+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