我有以下格式的时间序列数据,其中值表示自上次录制以来的累计金额。我想要做的是“传播”包含NaN的过去时期的累积金额,以便输入:
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
是否有一种惯用的Pandas方法可以做到这一点,而不仅仅是对数据进行for循环?我尝试了各种涉及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