Python中如何按两列分组,计算加权平均值,返回DataFrame



目标:取一个DataFrame,按该DataFrame的两列分组,计算第三列的加权平均值,并返回一个DataFrame。以下Reprex需要进行哪些调整?

##  REPREX
import pandas as pd
import numpy as np
# Turn into DataFrame
md = {"group1": ["A", "A", "B", "B", "A"],
"group2": [1, 0, 1, 1, 1],
"var1":[343, 345, 567, 345, 212],
"wt":[1.2, 1.3, 1.8, .9, 1.9]}
# Turn into DataFrame
my_df = pd.DataFrame(md)
# This works to get unweighted means:
grouped__means = my_df.groupby(["group1", "group2"], as_index=False)[["var1"]].mean()
# This does NOT work for weighted means:
grouped__wtd_means = my_df.groupby(["group1", "group2"], as_index=False)[["var1"]].agg(np.average(weights=my_df["wt"]))
# What needs to change?

您可以在此处使用GroupBy.apply

df.groupby(['group1', 'group2']).apply(lambda x: np.average(x['var1'], weights=x['wt']))
group1  group2
A       0         345.000000
1         262.709677
B       1         493.000000
dtype: float64

对于许多组,自己计算加权平均值以避免应用。将这些值乘以权重并求和,然后除以权重的和。pandas将在分区的索引上对齐。

(df['var1'].mul(df['wt']).groupby([df['group1'], df['group2']]).sum()
.divide(df.groupby(['group1', 'group2'])['wt'].sum()))
group1  group2
A       0         345.000000
1         262.709677
B       1         493.000000
dtype: float64

最新更新