计算以上行的算术平均数

2022-04-17 00:00:00 python numpy pandas dataframe mean

问题描述

我有一个数据集,如下所示:

Value         Type       mean
-1.975767     Weather   
-0.540979     Fruits
-2.359127     Fruits
-2.815604     Corona
-0.929755     Weather

我要迭代每一行并计算上面每一行的平均值(仅当Type匹配时)。我想将此值放在平均值列中。平均值的计算方式为:

所有值之和/观察次数

此处,观察次数将是到目前为止某个类型发生的次数。

例如,在第一行中,对于天气n=1,上面没有天气";行,因此平均值为-1.975767/1=-1.975767。

在第二行中,其上方没有水果行,因此平均值将仅为-0.540979/1=-0.540979。

然而,在第三行中,当我们扫描前面的所有行时,我们看到水果在此之前已经出现,因此,对于水果,n=2。因此,我们应该得到最后一个水果的价值,并计算一个新的平均值。因此,这里的平均值是-0.540979+(-2.359127)除以2。

Value         Type       mean
-1.975767     Weather   -1.975767
-0.540979     Fruits    -0.540979
-2.359127     Fruits    (-0.540979 -2.359127)  / 2
-2.815604     Corona    -2.815604
-0.929755     Weather   (-1.975767 -0.929755) / 2

执行此操作的有效方法是什么?

我看到两种可能的解决方案:

  1. 我们以某种方式存储每种类型的N值,然后只使用上次计算的特定类型的平均值,通过将N加1来更新N,然后计算特定行的新平均值。
  2. 如果存储N值不方便,则每次扫描某个类型的匹配项时,都会检查其相应值并再次计算所有值的平均值。

解决方案

尝试使用groupby+expanding+mean

df['mean'] = df.groupby('Type')['Value'].expanding().mean().droplevel(0)

输出:

>>> df
      Value     Type      mean
0 -1.975767  Weather -1.975767
1 -0.540979   Fruits -0.540979
2 -2.359127   Fruits -1.450053
3 -2.815604   Corona -2.815604
4 -0.929755  Weather -1.452761

相关文章