group的加权平均值不等于pandas groupby中的总平均值

Posted

技术标签:

【中文标题】group的加权平均值不等于pandas groupby中的总平均值【英文标题】:The weighted means of group is not equal to the total mean in pandas groupby 【发布时间】:2021-06-26 00:21:51 【问题描述】:

我在计算熊猫数据框的加权平均值时遇到了一个奇怪的问题。我想执行以下步骤:

(1) 计算所有数据的加权平均值 (2)计算每组数据的加权平均值

问题是当我执行第 2 步时,组均值的平均值(由每个组中的成员数加权)与所有数据的加权平均值(第 1 步)不同。数学上应该是(here)。我什至认为问题可能出在 dtype 上,所以我将所有内容都设置在 float64 上,但问题仍然存在。下面我提供了一个简单的例子来说明这个问题:

我的数据框有一个数据、一个权重和组列:

data = np.array([
    0.20651903, 0.52607571, 0.60558061, 0.97468593, 0.10253621, 0.23869854,
    0.82134792, 0.47035085, 0.19131938, 0.92288234
])
weights = np.array([
    4.06071562, 8.82792146, 1.14019687, 2.7500913, 0.70261312, 6.27280216,
    1.27908358, 7.80508994, 0.69771745, 4.15550846
])
groups = np.array([1, 1, 2, 2, 2, 2, 3, 3, 4, 4])
df = pd.DataFrame("data": data, "weights": weights, "groups": groups)
print(df)
>>> print(df)
       data   weights  groups
0  0.206519  4.060716       1
1  0.526076  8.827921       1
2  0.605581  1.140197       2
3  0.974686  2.750091       2
4  0.102536  0.702613       2
5  0.238699  6.272802       2
6  0.821348  1.279084       3
7  0.470351  7.805090       3
8  0.191319  0.697717       4
9  0.922882  4.155508       4

# Define a weighted mean function to apply to each group
def my_fun(x, y):
    tmp = np.average(x, weights=y)
    return tmp

# Mean of the population
total_mean = np.average(np.array(df["data"], dtype="float64"),
                        weights= np.array(df["weights"], dtype="float64"))
# Group data 
group_means = df.groupby("groups").apply(lambda d: my_fun(d["data"],d["weights"]))

# number of members of each group
counts = np.array([2, 4, 2, 2],dtype="float64")

# Total mean calculated from mean of groups mean weighted by counts of each group
total_mean_from_group_means = np.average(np.array(group_means,
                                              dtype="float64"),
                                     weights=counts)

print(total_mean)
0.5070955626929458

print(total_mean_from_group_means)
0.5344436242465216

如您所见,从组均值计算的总均值不等于总均值。我在这里做错了什么?

编辑:修正了代码中的一个错字。

【问题讨论】:

【参考方案1】:

您计算每个组内的加权平均值,因此当您根据加权平均值计算总平均值时,每个组的正确权重是组内权重的总和(而不是组的大小)。

In [47]: wsums = df.groupby("groups").apply(lambda d: d["weights"].sum())

In [48]: total_mean_from_group_means = np.average(group_means, weights=wsums)

In [49]: total_mean_from_group_means
Out[49]: 0.5070955626929458

【讨论】:

明白了!谢谢。

以上是关于group的加权平均值不等于pandas groupby中的总平均值的主要内容,如果未能解决你的问题,请参考以下文章

使用 NumPy 函数计算 Pandas 中的加权平均值

Pandas 数据透视表/groupby 计算加权平均值

使用 pandas/dataframe 基于 2 列计算加权平均值

pandas 数据透视表:通过 aggfunc 计算加权平均值

使用 pandas Rolling 方法计算加权移动平均值

Pandas:交换一个数据框中的特定列值并计算其加权平均值