计算以上行的算术平均数
问题描述
我有一个数据集,如下所示:
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
执行此操作的有效方法是什么?
我看到两种可能的解决方案:
- 我们以某种方式存储每种类型的N值,然后只使用上次计算的特定类型的平均值,通过将N加1来更新N,然后计算特定行的新平均值。
- 如果存储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
相关文章