Pandas惯用的方式来定制fillna

Kiv*_*Kiv 5 python pandas

我有以下格式的时间序列数据,其中值表示自上次记录以来的累计量.我想要做的是"传播"包含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
Run Code Online (Sandbox Code Playgroud)

成为这个输出:

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
Run Code Online (Sandbox Code Playgroud)

有没有惯用的Pandas方法来做到这一点,而不仅仅是对数据进行for循环?我已经尝试了各种涉及的东西fillna,dropna,isnull,做shift检查下值等,但我看不出如何把拼在一起.

Psi*_*dom 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
Run Code Online (Sandbox Code Playgroud)

或另一种选择:

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
Run Code Online (Sandbox Code Playgroud)