Python:替换窗口为2的滚动均值中的NaN为原始值
解决移动平均结果中NaN替换为原始数据的问题
没问题,我来帮你搞定这个需求~首先先明确你的原始数据和当前的处理情况:
原始数据集(Pandas Series)
import pandas as pd ts = pd.Series( [1808, 1251, 3023, 4857, 2506, 2453, 1180, 4239, 1759, 2539, 3923, 2999], index=['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], name='Sales' )
当前移动平均的问题
你执行的窗口大小为2的移动平均代码(其实shift(0)可以省略,因为它就是原数据):
shifted = ts.shift(0) window = shifted.rolling(window=2) means = window.mean() print(means)
得到的结果里第一个值是NaN,这是因为Jan没有前一个月份的数据来计算均值。要把这个NaN替换成对应位置的原始数据,有个非常简洁的方法:
修正后的解决方案
用Pandas的fillna()方法,直接传入原始的ts Series,它会自动匹配索引,把所有NaN的位置替换成原始数据对应的值:
# 简化移动平均计算(省略不必要的shift(0)) means = ts.rolling(window=2).mean() # 替换NaN为对应位置的原始数据 means_filled = means.fillna(ts) print(means_filled)
最终输出结果
Sales Jan 1808.0 Feb 1529.5 Mar 2137.0 Apr 3940.0 May 3681.5 Jun 2479.5 Jul 1816.5 Aug 2709.5 Sep 2999.0 Oct 2149.0 Nov 3231.0 Dec 3460.5 dtype: float64
如果只需要替换第一个位置的NaN,也可以直接赋值:means.iloc[0] = ts.iloc[0],不过fillna(ts)的方法更通用,能处理任何位置出现的NaN(比如数据中间有缺失值的情况)。
内容的提问来源于stack exchange,提问作者IndigoChild
相关产品推荐
相关产品推荐

