当前位置: 首页 > 面试题库 >

用滚动平均值或其他插值替换NaN或缺失值

洪弘毅
2023-03-14
问题内容

我有一个熊猫数据框,其中包含每月数据,我想为其计算12个月的移动平均值。但是缺少一月每个月的数据(NaN),所以我正在使用

pd.rolling_mean(data["variable"]), 12, center=True)

但这只是给我所有的NaN值。

有没有一种简单的方法可以忽略NaN值?我了解实际上,这将成为11个月的移动平均值。

数据框还有其他包含一月数据的变量,所以我不想只扔掉一月的列并进行11个月的移动平均。


问题答案:

有几种方法可以解决此问题,最好的方法取决于一月份的数据是否与其他月份系统地不同。大多数现实世界的数据可能都是季节性的,因此让我们以北半球一个随机城市的平均高温(华氏度)为例。

df=pd.DataFrame({ 'month' : [10,11,12,1,2,3],
                  'temp'  : [65,50,45,np.nan,40,43] }).set_index('month')

您可以按照建议使用滚动平均值,但是问题是您将获得全年的平均温度,而忽略了1月是最冷的月份这一事实。要对此进行更正,可以将窗口减小到3,这导致一月温度是12月和2月温度的平均值。(我也min_periods=1按照@
user394430的答案中的建议使用。)

df['rollmean12'] = df['temp'].rolling(12,center=True,min_periods=1).mean()
df['rollmean3']  = df['temp'].rolling( 3,center=True,min_periods=1).mean()

这些是改进,但是仍然存在用滚动方式覆盖现有值的问题。为了避免这种情况,您可以将其与update()方法结合使用(请参见此处的文档)。

df['update'] = df['rollmean3']
df['update'].update( df['temp'] )  # note: this is an inplace operation

甚至有更简单的方法可以保留现有值,而用上个月,下个月或上个月和下个月的平均值填充丢失的一月份温度。

df['ffill']   = df['temp'].ffill()         # previous month 
df['bfill']   = df['temp'].bfill()         # next month
df['interp']  = df['temp'].interpolate()   # mean of prev/next

在这种情况下,interpolate()默认为简单线性解释,但是您还可以使用其他几种插值选项。有关更多信息,请参见有关熊猫插值的文档。或这个statck溢出问题:
在熊猫的DataFrame上插值

这是带有所有结果的样本数据:

       temp  rollmean12  rollmean3  update  ffill  bfill  interp
month                                                           
10     65.0        48.6  57.500000    65.0   65.0   65.0    65.0
11     50.0        48.6  53.333333    50.0   50.0   50.0    50.0
12     45.0        48.6  47.500000    45.0   45.0   45.0    45.0
1       NaN        48.6  42.500000    42.5   45.0   40.0    42.5
2      40.0        48.6  41.500000    40.0   40.0   40.0    40.0
3      43.0        48.6  41.500000    43.0   43.0   43.0    43.0

特别要注意的是,“ update”和“ interp”在所有月份中给出的结果相同。尽管在此使用哪种都无关紧要,但在其他情况下,一种或另一种可能会更好。



 类似资料:
  • 问题内容: 我的pandas DataFrame主要填充了实数,但是其中也包含一些nan值。 如何nan用列的平均值替换s? 这个问题与这个问题非常相似:numpy array:用列的平均值替换nan值, 但是不幸的是,给出的解决方案不适用于pandas DataFrame。 问题答案: 你可以直接使用来nan直接填充: 的文档字符串说,应该是一个标量或快译通,但是,它似乎工作用为好。如果你想通过

  • 我有一个pandas DataFrame,其中大部分都是实数,但也有一些值。

  • 问题内容: 我有一个numpy数组,其中大多数都用实数填充,但是其中也包含一些值。 如何用列的平均值替换s? 问题答案: 无需循环:

  • 问题内容: 我正在尝试学习熊猫,但请对以下内容感到困惑。我想用行平均值替换NaN是一个数据框。因此,类似的东西应该可以工作,但是由于某种原因,它对我来说是失败的。我是否想念任何东西,我做错了什么?是因为其未执行; 但是这样的事情看起来很好 问题答案: 如评论所述,fillna的axis参数为NotImplemented。 注意:这在这里很重要,因为您不想用第n行平均值填写第n列。 现在,您需要遍历

  • 注意:我更喜欢如何处理和提出这些类型的解决方案的指南,而不是解决方案本身。 我的系统中有一个非常关键的性能函数,在特定上下文中显示为头号分析热点。它正在进行k-means迭代(已经使用并行处理每个工作线程中的点子范围的多线程)。 处理这段代码所需的任何时间节省都非常重要,所以我经常在这段代码上做很多事情。例如,可能值得将质心循环放在外部,并针对给定质心并行遍历点。这里的簇点数量以百万计,而质心的数

  • 例如,我想把'NAN'换成'dog'和'cat'。像从1-30'楠'应该换成'dog',从40-100'应该换成'cat'。我应该怎么做