1

我有一个名为 dF 的数据框:

                      Twa_mean
Date_Time                    
2007-01-01 07:00:00       6.5
2007-01-01 07:10:00       6.4
2007-01-01 07:20:00       6.4
2007-01-01 07:30:00       NaN
2007-01-01 07:40:00       NaN
2007-01-01 07:50:00       NaN

我试图获得滚动平均值(window=2),但没有考虑 NaN,所以,我使用 scipy.stats 的 nanmean 函数:

import scipy.stats as st

f=lambda x: st.nanmean(x)

d=pd.rolling_apply(dF,2,f)

但是,我得到了这个:

                     Twa_mean
Date_Time                    
2007-01-01 07:00:00       NaN
2007-01-01 07:10:00      6.45
2007-01-01 07:20:00      6.40
2007-01-01 07:30:00       NaN
2007-01-01 07:40:00       NaN
2007-01-01 07:50:00       NaN

就像 st.nanmean 没有忽略 NaN,发生了什么?

我希望这样:

                     Twa_mean
Date_Time                    
2007-01-01 07:00:00       NaN
2007-01-01 07:10:00      6.45
2007-01-01 07:20:00      6.40
2007-01-01 07:30:00      6.40
2007-01-01 07:40:00       NaN
2007-01-01 07:50:00       NaN
4

1 回答 1

0

我认为 pandas rolling mean 将涵盖您给出的案例。您只需要指定minimum_periods参数rolling_mean

In [53]: df
Out[53]: 
                       1
0                       
2007-01-01 07:00:00  6.5
2007-01-01 07:10:00  6.4
2007-01-01 07:20:00  6.4
2007-01-01 07:30:00  NaN
2007-01-01 07:40:00  NaN
2007-01-01 07:50:00  NaN

In [54]: pd.rolling_mean(df, 2, min_periods=1)
Out[54]: 
                        1
0                        
2007-01-01 07:00:00  6.50
2007-01-01 07:10:00  6.45
2007-01-01 07:20:00  6.40
2007-01-01 07:30:00  6.40
2007-01-01 07:40:00   NaN
2007-01-01 07:50:00   NaN

这并不完全符合您的预期,但我会说它更加一致。您期待NaN第一个,大概是因为您刚刚进行了 1 次观察。但是对于后来的那些,您将平均值设置为等于单个观察值(由于 NaN)。如果你真的想要这个,你可以通过并设置第一个n观察值(n=1在这种情况下)等于NaN之后(res = pd.rolling_mean(df, 2, min_periods=1); res.iloc[:n] = np.nan)。

于 2013-10-31T16:22:56.747 回答