【问题标题】:Rolling_apply and scipy nanmean behaviourRolling_apply 和 scipy nanmean 行为
【发布时间】:2013-10-31 16:06:05
【问题描述】:

我有一个名为 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

【问题讨论】:

  • 您的预期输出是什么?这是我期望的输出。也许你想删除所有的 NaN?在这种情况下使用 .dropna()
  • 有什么理由不使用熊猫的滚动平均值? pd.rolling_mean(df, 2)?
  • 哦,经过您的修改,我明白了。这也是我所期望的。
  • 我没有使用它,因为这样的函数,只要有一个 NaN,平均值就等于 NaN,我想计算平均值,即使有一些 NaN。

标签: python pandas scipy


【解决方案1】:

我认为 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 是第一个,大概是因为您刚刚进行了第一次观察。但是对于后来的那些,您将平均值设置为等于单个观察值(由于 NaN)。如果你真的想要这个,你可以设置第一个n 观察(在这种情况下为n=1)等于NaNres = pd.rolling_mean(df, 2, min_periods=1); res.iloc[:n] = np.nan)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-27
    • 2016-09-30
    • 2014-11-13
    • 2020-12-27
    • 2012-11-09
    • 1970-01-01
    • 2019-04-05
    • 2013-10-07
    相关资源
    最近更新 更多